dot運(yùn)算
numpy官方文檔上所寫:
- 如果 a 和 b都是 1-D arrays,它的作用是計(jì)算內(nèi)積戈锻。(不進(jìn)行復(fù)共軛)
>>> np.dot(3, 4)
12
>>> np.dot([2j, 3+3j], [2j, 3j])
(-13+9j)
- 如果 a 和 b 是 2-D arrays, 作用是矩陣的乘積和媳, a 和 b的維數(shù)要滿足矩陣乘積維數(shù)要求,此時(shí)推薦使用
matmul
或a @ b
留瞳。
>>> a = [[1, 0], [0, 1]]
>>> b = [[4, 1], [2, 2]]
>>> np.dot(a, b)
array([[4, 1],
[2, 2]])
- 如果 a 或 b 是 0-D (標(biāo)量), 等價(jià)于
multiply
,推薦使用numpy.multiply(a, b)
或a * b
璧微。
- 如果 a 是 N-D array 且 b 是 1-D array硬梁, 作用是在a 和 b的最后一個(gè)軸上進(jìn)行sum product運(yùn)算。
>>> a = array([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]],
[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]]])
>>> b = np.array([1,2,3,4])
>>>np.dot(a, b)
array([[ 30., 70., 110.],
[ 30., 70., 110.]])
- 如果a 是 N-D array 且 b 是 M-D array (
M>=2
), 作用是在a的最后一個(gè)軸上和b的倒數(shù)第二個(gè)軸上進(jìn)行sum product屹电,即 :
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
>>> a = np.arange(3*4*5*6).reshape((3,4,5,6))
>>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3))
>>> np.dot(a, b)[2,3,2,1,2,2]
499128
>>> sum(a[2,3,2,:] * b[1,2,:,2])
499128
*運(yùn)算
對(duì)于ndarray, * 作用的是進(jìn)行element-wise乘積跃巡,必要時(shí)需要broadcast,作用同np.multipy
>>> a = np.array(range(6)).reshape((2,3))
>>> b = np.array([1,0,1])
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> b
array([1, 0, 1])
>>> c= a*b
>>> c
array([[0, 0, 2],
[3, 0, 5]])
>>> d = a*b.T
>>> d
array([[0, 0, 2],
[3, 0, 5]])
而對(duì)于matrix外莲,* 則表示矩陣相乘兔朦,運(yùn)算必須保證矩陣相乘的法則:
>>> A=np.matrix(a)
>>> B=np.matrix(b)
>>> A
matrix([[0, 1, 2],
[3, 4, 5]])
>>> B
matrix([[1, 0, 1]])
>>> C=A*B
ValueError: shapes (2,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
#維數(shù)不匹配
>>> C=A*B.T
>>> C
matrix([[2],
[8]])
multiply運(yùn)算
函數(shù)原型是
numpy.multiply(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'multiply'>
Returns:
y : ndarray
x1 和 x2的element-wise乘積,保證x1和x2有相同的維數(shù)烘绽,或者進(jìn)行broadcast之后兩者有相同的維數(shù)
>>> np.multiply(2.0, 4.0)
8.0
>>> x1 = np.arange(9.0).reshape((3, 3))
>>> x2 = np.arange(3.0)
>>> np.multiply(x1, x2)
array([[ 0., 1., 4.],
[ 0., 4., 10.],
[ 0., 7., 16.]])
#要進(jìn)行broadcast