1. Numpy
创建和使用一维数组
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ["STFangsong"]# 添加字体
plt.rcParams['axes.unicode_minus'] = False #默认是使用Unicode负号,设置正常显示字符,如正常显示负号
%config InlineBackend.figure_format = 'svg'
# 方法一:通过array函数将python中的list
array1 = np.array([1,2,3,4,5],dtype = 'int32')
array1
array([1, 2, 3, 4, 5])
#数组元素类型
array1.dtype
dtype('int32')
# 数组每个元素占用空间
array1.itemsize
4
#数组元素占用空间
array1.nbytes
20
#数组类型
type(array1)
numpy.ndarray
#数组元素个数
array1.size
5
# 数组的维度
array1.ndim
1
# 数组的形状
array1.shape
(5,)
#三维数组(图片)
lsy = plt.imread('1.jpg')
plt.imshow(lsy)
<matplotlib.image.AxesImage at 0x21f88c898e0>
# 垂直翻转(行坐标逆序)
plt.imshow(lsy[::-1,:])
<matplotlib.image.AxesImage at 0x21f8917f250>
# 水平翻转(列坐标逆序)
plt.imshow(lsy[:,::-1])
<matplotlib.image.AxesImage at 0x21f8ba68820>
抠图
head = lsy[:610,500:1000,:]
plt.imshow(head)
<matplotlib.image.AxesImage at 0x1c8e49ce550>
#方法二:通过arange函数指定数据范围创建一维数组(左闭右开)
array2 = np.arange(10)
array2
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
array3 = np.arange(1,20,3)
array3
array([ 1, 4, 7, 10, 13, 16, 19])
array4 = np.arange(1,10,0.5)
array4
array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. ,
7.5, 8. , 8.5, 9. , 9.5])
# 方法三:通过linspace函数指定范围以及抽取的数据量来创建一维数组
array5 = np.linspace(-5,5,50) #在闭区间[-5,5]抽取50个元素创建一维数组
array5
array([-5. , -4.79591837, -4.59183673, -4.3877551 , -4.18367347,
-3.97959184, -3.7755102 , -3.57142857, -3.36734694, -3.16326531,
-2.95918367, -2.75510204, -2.55102041, -2.34693878, -2.14285714,
-1.93877551, -1.73469388, -1.53061224, -1.32653061, -1.12244898,
-0.91836735, -0.71428571, -0.51020408, -0.30612245, -0.10204082,
0.10204082, 0.30612245, 0.51020408, 0.71428571, 0.91836735,
1.12244898, 1.32653061, 1.53061224, 1.73469388, 1.93877551,
2.14285714, 2.34693878, 2.55102041, 2.75510204, 2.95918367,
3.16326531, 3.36734694, 3.57142857, 3.7755102 , 3.97959184,
4.18367347, 4.3877551 , 4.59183673, 4.79591837, 5. ])
#创建两个一维数组
x = np.linspace(-2 * np.pi, 2 * np.pi, 180)
y = np.round(np.sin(x),4)
# x,y
plt.plot(x,y,color = 'pink',marker = '*')
plt.show
<function matplotlib.pyplot.show(close=None, block=None)>
# 方法四:通过随机函数创建一维数组randint(左闭右开)
# 整数
array6 = np.random.randint(1,100,10)
array6
array([58, 39, 8, 6, 24, 54, 17, 13, 27, 17])
# 小数
array7 = np.random.random(10)
array7
array([0.59853349, 0.73005233, 0.9334901 , 0.73028284, 0.7263449 ,
0.27506243, 0.51343595, 0.16541789, 0.30377838, 0.71014349])
heights = np.random.normal(169.7,6.5,500)
# np.round(heights,2)
plt.hist(heights,bins = 10)
plt.show
<function matplotlib.pyplot.show(close=None, block=None)>
array8 = np.arange(1,10)
array8
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 数组的下标(索引)运算
array8[4]
5
# 布尔索引
# 对ndarray进行关系运算会产生一组布尔值
array8 > 5 # 判断array8中所有元素与5比较大小,返回布尔值
array([False, False, False, False, False, True, True, True, True])
# 保留array8中大于5的元素(比较返回值为True的值保留)
array8[array8>5]
array([6, 7, 8, 9])
# 大于5的偶数 &
array8[(array8 > 5) & (array8 % 2 == 0)]
array([6, 8])
# 大于5或为偶数 |
array8[(array8 > 5) | (array8 % 2 == 0)]
array([2, 4, 6, 7, 8, 9])
# 大于5或为奇数(取反) ~
array8[(array8 > 5) | ~(array8 % 2 == 0)]
array([1, 3, 5, 6, 7, 8, 9])
# 花式索引 需要元素的索引填入[]
array8[[0,1,0,1,-1,2]]
array([1, 2, 1, 2, 9, 3])
# 切片
array8[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1])
2. 创建二维数组
# 方法一:通过array函数讲话嵌套列表变成二维数组
array9 = np.array([[1,2,3],[4,5,6],[7,8,9]])
array9
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 数组形状
array9.shape
(3, 3)
# 数组维度
array9.ndim
2
# 方法二:将一维数组调形调整为二维数组
array10 = array8.reshape((3,3))
array10
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
array9 == array10
array([[ True, True, True],
[ True, True, True],
[ True, True, True]])
array10[array10 > 5]
array([6, 7, 8, 9])
# 方法三:用随机方式创建二维数组
np.random.randint(60,101,(5,3)) #在区间[60,100]取元素创建一个5行3列的二维数组
array([[71, 75, 76],
[97, 88, 66],
[87, 88, 99],
[62, 68, 80],
[81, 97, 70]])
np.random.randint(60,101,(5,3,3)) #在区间[60,100]取元素创建一个5x(3x3)的三维数组
array([[[ 79, 100, 60],
[100, 100, 73],
[ 88, 80, 64]],
[[ 65, 97, 61],
[ 97, 61, 61],
[ 97, 88, 73]],
[[ 63, 94, 85],
[ 73, 96, 100],
[ 98, 94, 99]],
[[ 99, 77, 79],
[ 94, 82, 63],
[ 83, 63, 86]],
[[ 67, 62, 89],
[ 70, 83, 80],
[100, 95, 68]]])
# 方法四:创建一个全0的数组
np.zeros((5,5),dtype = 'int32')
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
# 创建全1数组
np.ones((5,5))
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
# 创建全为指定元素的数组
np.full((5,5),9)
array([[9, 9, 9, 9, 9],
[9, 9, 9, 9, 9],
[9, 9, 9, 9, 9],
[9, 9, 9, 9, 9],
[9, 9, 9, 9, 9]])
# 单位矩阵
np.eye(3) # 数字代表阶数
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
# 取指定位置的元素
array10[1,1]
# array10[1][1]
5
# 也支持负向索引
array10[-1,-1]
9
# 取一行一列元素创建为一个二维数组
array10[:1,:1]
array([[1]])
# 取四角元素
array10[::2,::2]
array([[1, 3],
[7, 9]])
1.3 数组对象的方法
1.3.1获取描述性统计信息
-
集中趋势:均值、中位数、众数
-
离散趋势:最大值、最小值、极差、四分位距离、方差、标准差
- 下四分位数(25%分位数),通常记为Q1
- 中位数(50%分位数),通常记为Q2
- 上四分位数(75%分位数),通常记为Q3
- 四分位距离:IQR = Q3 - Q1
- data < Q1 - 1.5 * IQR
- data < Q3 + 1.5 * IQR
array11 = np.random.randint(10,100,7)
array11
array([93, 43, 61, 58, 17, 95, 40])
# 平均值
array11.mean()
49.285714285714285
# 排序 不改变原数组
np.sort(array11)
array([16, 31, 39, 51, 64, 65, 79])
# 中位数
np.median(array11)
51.0
array12 = np.array([1,1,3,5,5,5,5,5,6,6,7,8])
array12
array([1, 1, 3, 5, 5, 5, 5, 5, 6, 6, 7, 8])
Mean = array12.mean()
Mean
4.75
Median = np.median(array12)
Median
5.0
# 极差
Ptp = np.ptp(array12)
Ptp
7
# 方差
Var = array12.var()
Var
4.1875
# 标准差
Std = array12.std()
Std
2.0463381929681126
# 下四分位数
Q1 = np.quantile(array12,0.25)
Q1
4.5
# 中位数
Q2 = np.quantile(array12,0.5)
Q2
5.0
# 上四分位数
Q3 = np.quantile(array12,0.75)
Q3
6.0
# 四分位距离
IQR = Q3 - Q1
IQR
1.5
# 最大值索引
array11.argmax()
# 最小值索引
# array11.argmin()
5
# cumulative sum 累计和
array11.cumsum()
array([ 93, 136, 197, 255, 272, 367, 407], dtype=int32)
array13 = np.random.randint(60,101,(5,3))
array13
array([[79, 90, 75],
[67, 72, 90],
[71, 63, 93],
[99, 70, 82],
[81, 79, 85]])
array14 = array13.flatten()
array14
array([79, 90, 75, 67, 72, 90, 71, 63, 93, 99, 70, 82, 81, 79, 85])
# 返回排序结果,原数组无影响
np.sort(array14)
array([63, 67, 70, 71, 72, 75, 79, 79, 81, 82, 85, 90, 90, 93, 99])
# 就地排序,修改原数组
array14.sort()
array14
array([63, 67, 70, 71, 72, 75, 79, 79, 81, 82, 85, 90, 90, 93, 99])
# 交换0,1轴
array13.swapaxes(0,1)
array([[79, 67, 71, 99, 81],
[90, 72, 63, 70, 79],
[75, 90, 93, 82, 85]])
# 转置
# array13.transpose()
array13.T
array([[79, 67, 71, 99, 81],
[90, 72, 63, 70, 79],
[75, 90, 93, 82, 85]])
数组与标量的运算
array15 = np.arange(1,10)
array16 = np.array([1,1,1,2,2,2,3,3,3])
# 数组相加 --- 对应位置元素相加
array15 + array16
array([ 2, 3, 4, 6, 7, 8, 10, 11, 12])
# 数组乘幂 --- 对应位置元素乘幂
array15 ** array16
array([ 1, 2, 3, 16, 25, 36, 343, 512, 729], dtype=int32)
广播机制
- 两个数组的后缘维度相同;
- 两个数组的后缘维度不同,但其中一方为1。
后缘维度:数组的shape属性,从后往前看的部分
# 矩阵乘法
matrix1 = np.array([[1,0,2],[-1,3,1]])
matrix2 = np.array([[3,1],[2,1],[1,3]])
matrix1 @ matrix2
# 函数
# np.matmul(matrix1,matrix2)
array([[5, 7],
[4, 5]])