这是我参与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))
>>> 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 对的数值进行求和、最大值和最小值。