深入浅出 Numpy 基础篇(2)

1,323 阅读2分钟

这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

数组上的算术运算符是按元素计,这是 numpy 的优点,例如下面a-b其中 a 和 b 都是 numpy 数组,那么 numpy 好处就是无需遍历两个数组来中元素,就可以进行按元素进行加减乘除运算。

a = np.array([10,20,50,60,80])
b = np.arange(0,10,2)

print(a)
print(b)
print(a - b)
[10 20 50 60 80]
[0 2 4 6 8]
[10 18 46 54 72]
print(b**2)
#[ 0  4 16 36 64]

这里b**2 是对数组中每一个元素进行平方运算。

10 * np.sin(a)
print(10*np.sin(a))

与其他用于操作矩阵的语言不通,* 表示两个矩阵中对应元素进行相乘,所以需要两个矩阵形状一致。可以是

A = np.array([[1, 1],
               [0, 1]])
>>> B = np.array([[2, 0],
               [3, 4]])
>>> A * B     # 逐点相乘
array([[2, 0],
       [0, 4]])

可以使用 np.multiply 进行两个矩阵逐点相乘的运算,不过这个没有 A*B

np.multiply(A,B)

我们也可以对矩阵的一部分进行相乘操作。

A = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])

B = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20]])

print(np.multiply(A[ 0,:], B[ 1,: ]))

在 python 3.5 之后可以使用操作符 @ 实现点乘,可以可以调用

a = np.array([[1,2],[5,6]]) 
b = np.array([2,3])
print(np.dot(a,b))

array_dot.png

>>> A @ B     # 矩阵相乘
array([[5, 4],
       [3, 4]])
>>> A.dot(B)  # 矩阵点乘
array([[5, 4],
       [3, 4]])

+=*=,都是就地取材,修改现有的数组,而不是创建一个新的数组。

我们可以将 2 维矩阵理解为一个数表,或者一些按照一定结构组织在一起数字,对于这一组数字,我们通过一些量来表示这些数字,有时候我们关系一些商品销量总数,有时候我们只是关心数字中的最大值或者最小值而已。


a = rg.random((2, 3))
>>> a
array([[0.82770259, 0.40919914, 0.54959369],
       [0.02755911, 0.75351311, 0.53814331]])
>>> a.sum()
3.1057109529998157
>>> a.min()
0.027559113243068367
>>> a.max()
0.8277025938204418

想这些对数组进行求和、计算其最大值和最小值,都是 ndarray 类所提供的。

b = np.arange(12).reshape(3, 4)
>>> b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
>>> b.sum(axis=0)     # sum of each column
array([12, 15, 18, 21])
>>>
>>> b.min(axis=1)     # min of each row
array([0, 4, 8])
>>>
>>> b.cumsum(axis=1)  # cumulative sum along each row
array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]])

默认情况下,这些求和、求最大值、最小值的操作适用于数组,不过也可以通过指定 axis,就可以沿指定 axis 对的数值进行求和、最大值和最小值。