Numpy
Numpy 最为核⼼的数据类型是 ndarray ,使⽤ ndarray 可以处理⼀维、⼆维和多维数组,该对象相当于是⼀个快 速⽽灵活的⼤数据容器。
创建
一维数组
list1 = [[random.randint(20,100) for _ in range(3)] for _ in range(5)]
list1
[[70, 99, 56], [99, 21, 35], [59, 53, 70], [44, 44, 34], [91, 95, 40]]
- 通过 列表直接转
ar1 = np.array(list1)
ar1
array([[70, 99, 56],
[99, 21, 35],
[59, 53, 70],
[44, 44, 34],
[91, 95, 40]])
- 使用arange
ar2 = np.arange(1,20)
ar2
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19])
- 使用np.random创建
ar3 = np.random.rand(10)
ar3
array([0.03567423, 0.86881279, 0.70364535, 0.06383336, 0.1424191 ,
0.11051172, 0.0623674 , 0.24031952, 0.85205838, 0.49430325])
二维数组
- 使用zeros、ones、full的方式
ar4 = np.zeros((3,2))
print(ar4)
ar4 = np.full((2,3),5)
ar4
[[0. 0.]
[0. 0.]
[0. 0.]]
array([[5, 5, 5],
[5, 5, 5]])
- 使用np.random
ar5 = np.random.randint(1,50,(3,4))
ar5
array([[28, 3, 38, 7],
[29, 33, 38, 4],
[41, 47, 18, 17]])
- 使用reshape将一维数组转成二维数组 此方法转换前后个数要相同
ar6 = np.array([1,2,3,4,5,6]).reshape(2,3)
ar6
array([[1, 2, 3],
[4, 5, 6]])
- 使用np.eye 创建单位矩阵
ar7 = np.eye(2)
ar7
array([[1., 0.],
[0., 1.]])
索引和切片
注意: 切片会创建新数组,但是他实际是共享了原数组的空间,所以修改切片后的,原来的也会变;
花式索引和布尔索引也会创建新数组,但没有共享原数组,是建了一个完全的新数组;
普通索引
一维数组
总结:一维数组的索引使用和python中的list一致
array23 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
array23
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
正向
print(array23[0], array23[array23.size - 1])
逆向
print(array23[-array23.size], array23[-1])
1 9
1 9
二维数组
总结:与python中嵌套列表索引类似,一层一层的取,从0到n-1,可以取行,但是不能取出整列!
array1
array1 = np.random.randint(20,50,(3,3))
array1
array([[29, 30, 28],
[29, 29, 34],
[34, 21, 37]])
array1[2]
array([34, 21, 37])
0
array1[0][0]
29
array1.ndim
2
切片
一维数组与list相同;
二维数组可以理解成先切行再切列,也可以理解成一层一层的切,可以单独切出列来
如果索引配合切片使用需要注意,此时会降维
array1
array([[29, 30, 28],
[29, 29, 34],
[34, 21, 37]])
# 第一行(:1),第二、三列(1:3)
array1[:1,1:3]
array([[30, 28]])
# 都用切片,维度不变
array1[2:,:]
array([[34, 21, 37]])
print('维度不变:', array1[:,2:])
print('索引配合切片,降维:', array1[:,2])
维度不变: [[28]
[34]
[37]]
索引配合切片,降维: [28 34 37]
花式索引
花式索引(Fancy indexing)是指利⽤整数数组进⾏索引,可以使⽤正向或负向索引。
对于一维数组,目的就是取多个值,与切片相比最大的区别就是可以跳着取数
array23
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 一维数组利用数组[1,2] 来进行索引,跳着去第1和第5个
array23[[1,5]]
array([2, 6])
array1
array([[29, 30, 28],
[29, 29, 34],
[34, 21, 37]])
# 二维数组里利用一个列表,取得是行,不会降维
array1[[0]]
array([[29, 30, 28]])
# 如果是利用二个列表做索引,是用行,列的方式取值:0行1列,2行0列,会降维
array1[[0,2],[1,0]]
array([30, 34])
布尔索引
布尔索引就是通过布尔类型的数组对数组元素进⾏索引(索引也是个索引,所以需要两个[[]])
array23[array23 >=5]
array([5, 6, 7, 8, 9])
数组的属性
常用的一些属性:
- size 数组元素的个数
- shape 数组的形状
- dtype 数组元素的数据类型
- ndim 数组的维度
- itemsize 数组中单个元素占的空间
- nbytes 所有元素占的字节空间
数组的函数
统计方法
统计⽅法主要包括:
sum() 、 mean() 、 std() 、 var() 、 min() 、 max() 、 argmin() 、 argmax() 、 cumsum()等,
分别⽤于对数组中的元素求和、求平均、求标准差、求⽅差、找最⼤、找最⼩、求累积和等,请参考下⾯的代码。
array28 = np.array([1, 2, 3, 4, 5, 5, 4, 3, 2, 1])
print(array28.sum())
print(array28.mean())
print(array28.max())
print(array28.min())
print(array28.std())
print(array28.var())
print(array28.cumsum())
30
3.0
51
1.4142135623730951
2.0
[ 1 3 6 10 15 20 24 27 29 30]
需要注意的是,这些方法中基本都有一个axis参数,可以决定计算的方向,默认是None,也就是按全部数据计算。
当axis=0时,说明是按行的方向计算,得到的就是列数的结果;
当axis=1时,是按列方向计算,得到的是行数的结果;
array1
array([[29, 30, 28],
[29, 29, 34],
[34, 21, 37]])
# 按行的方向算 x1+x2+...+x5 结果是列数
ar1.mean(axis=0)
array([68.4, 63. , 66.6])
# 按列的方向算 每行列1-列3的平均值 结果是行数
ar1.mean(axis=1)
array([65. , 80. , 58. , 69.66666667, 57.33333333])
其他方法
-
all() / any() ⽅法:判断数组是否所有元素都是 True / 判断数组是否有为 True 的元素。
-
astype() ⽅法:拷⻉数组,并将数组中的元素转换为指定的类型。
-
dump() ⽅法:保存数组到⽂件中,可以通过 NumPy 中的 load() 函数从保存的⽂件中加载数据创建数组。 代码:
array31.dump('array31-data') array32 = np.load('array31-data', allow_pickle=True) array32 输出: array([[1, 2], [3, 4], [5, 6]])
-
fill() ⽅法:向数组中填充指定的元素。
-
flatten() ⽅法:将多维数组扁平化为⼀维数组。 代码:
array32.flatten() 输出: array([1, 2, 3, 4, 5, 6])
-
nonzero() ⽅法:返回⾮0元素的索引。
-
round() ⽅法:对数组中的元素做四舍五⼊操作。
-
sort() ⽅法:对数组进⾏就地排序。 代码:
array33 = np.array([35, 96, 12, 78, 66, 54, 40, 82]) array33.sort() array33 输出: array([12, 35, 40, 54, 66, 78, 82, 96])
- swapaxes() 和 transpose() ⽅法:交换数组指定的轴。 代码:
# 指定需要交换的两个轴,顺序⽆所谓 array32.swapaxes(0, 1) 输出: array([[1, 3, 5], [2, 4, 6]]) 代码: # 对于⼆维数组,transpose相当于实现了矩阵的转置 array32.transpose() 输出: array([[1, 3, 5], [2, 4, 6]])
-
tolist() ⽅法:将数组转成Python中的 list 。