當孔乙己說回字有四樣寫法的時候,相信各位都是這樣的表情吧?
實際上,NumPy數組乘法遠不止四種。為了在寫作和閱讀時保持清晰的邏輯和清醒的頭腦,本文僅對四種最常見的數組乘法給出詳細說明,並用一道數學題來演示向量點乘和叉乘的用法。
1. 星乘(*)先聲明一下:星乘這個說法,是我自己創造的,因為我實在不知道數組的這種乘法有沒有其他高大上的名字,只好用運算符來表示了。所謂數組星乘,就是數組的對應元素相乘,這也是初學NumPy的同學最早接觸到的數組乘法。>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> a*b
array([ 4, 10, 18])
>>> a = np.arange(6).reshape((2,3))
>>> b = np.arange(6,12).reshape((2,3))
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> b
array([[ 6, 7, 8],
[ 9, 10, 11]])
>>> a*b
array([[ 0, 7, 16],
[27, 40, 55]])
>>> a = np.arange(6).reshape((2,3))
>>> b = np.array([1,2,3])
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> b
array([1, 2, 3])
>>> a*b
array([[ 0, 2, 6],
[ 3, 8, 15]])
>>> b*a
array([[ 0, 2, 6],
[ 3, 8, 15]])
>>> a = np.array([1,0,0])
>>> b = np.array([0,1,0])
>>> np.dot(a,b) # 向量a和向量b相互垂直,其點積為0
0
>>> a = np.arange(6).reshape((2,3))
>>> b = np.arange(6,18).reshape((3,4))
>>> np.dot(a,b) # 滿足點乘條件
array([[ 38, 41, 44, 47],
[128, 140, 152, 164]])
>>> np.dot(b,a) # 不滿足點乘條件
Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
np.dot(b,a)
File "<__array_function__ internals>", line 6, in dot
ValueError: shapes (3,4) and (2,3) not aligned: 4 (dim 1) != 2 (dim 0)
>>> a = np.array([2,0])
>>> b = np.array([2,2])
>>> np.cross(a,b) # 平面向量叉乘,其結果是以兩個向量為邊的菱形的面積
array(4)
>>> a = np.array([1,0,0])
>>> b = np.array([0,1,0])
>>> np.cross(a,b) # x軸叉乘y軸,得到z軸
array([0, 0, 1])
>>> np.cross(b,a) # 叉乘交換順序,得到反向的法向量
array([ 0, 0, -1])
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6,7])
>>> np.outer(a,b)
array([[ 4, 5, 6, 7],
[ 8, 10, 12, 14],
[12, 15, 18, 21]])
>>> def is_orthogonal(a, b, c, d):
ab = np.array(b) - np.array(a)
cd = np.array(d) - np.array(c)
ac = np.array(c) - np.array(a)
orth = np.cross(ab, cd)
return orth.any() and np.dot(orth, ac) == 0