Numpy
8 Numpy02
8.1 Numpy数组算术
数组之所以重要是因为它允许我们进行批量操作数据并且没有任何for循环。也被称为向量化。
数组与标量的算术操作
数组与标量的算术操作会把计算参数传递给数组的每一个元素。
import numpy as np
arr = np.arange(6).reshape(2,3)
arr+1
--------------------
array([[1, 2, 3],
[4, 5, 6]])
两个等尺寸数组的算术操作
两个等尺寸数组的算术操作实际上是逐元素操作。
arr1 = np.arange(1,7).reshape(2,3)
arr2 = np.arange(4,10).reshape(2,3)
arr1+arr2
# arr2/arr1 (都可以执行)
# arr2-arr1
# arr2*arr1
-------------------------------------
array([[ 5, 7, 9],
[11, 13, 15]])
8.2 广播机制
广播机制规则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
举例
arr2 = np.arange(6).reshape(2,3)
arr3 = np.arange(2).reshape(2,1)
print(arr2)
print(arr3)
arr2 - arr3
------------------------------
[[0 1 2]
[3 4 5]]
[[0]
[1]]
array([[0, 1, 2],
[2, 3, 4]])
数组拼接
- np.vstack() 垂直拼接
- np.hstack() 水平拼接
注意
- 水平拼接需要对应行数一致,垂直拼接需要对应列数一致。
arr8 = np.arange(3).reshape(1,3) ###注意vstack里面的参数是元组
arr9 = np.arange(9).reshape(3,3)
np.vstack((arr8,arr9))
-------------------------
array([[0, 1, 2],
[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
arr6 = np.arange(6).reshape(2,3)
arr7 = np.arange(8).reshape(2,4)
np.hstack((arr6,arr7))
---------------------------------
array([[0, 1, 2, 0, 1, 2, 3],
[3, 4, 5, 4, 5, 6, 7]])
8.3 切片
一维索引与切片
同python中的内建数据类型list一致。
注意
- 索引默认从0开始
- 切片左闭右开
- 步长为整数
二维索引与切片
- 二维数组递归方式获取
- 二维数组逗号分隔获取(行,列)
- 取单行 arr[x1,:]
- 取连续行 arr[x1:x2,:]
- 取分开行 arr[[x1,x2],:]
- 取子矩阵 arr[x1:x2,y1:y2]
- 取点 arr[[x1,x2],[y1,y2]]
举例如下 (懒得编辑…)
注意
• 当有需要修改数组当中的值时,我们可以直接取值进行赋值。
• 当数组与标量进行比较时,数组当中每个元素与标量进行比较,返回bool值。 与此同时,该比较也可以作为索引,被称为布尔索引。比如arr[arr>20]
举例如下:
#取值 赋值
arr = np.arange(16).reshape(4,4)
arr[1:3,1:3] = 0
arr
--------------------
array([[ 0, 1, 2, 3],
[ 4, 0, 0, 7],
[ 8, 0, 0, 11],
[12, 13, 14, 15]])
arr1 = np.arange(16).reshape(4