在对numpy数组进行矩阵运算时,尤其要注意一维数组的维度对应问题。
结论:一维数组在进行矩阵运算时,会根据左乘右乘的矩阵维度自动判断自身维度,无需转置操作,若可以匹配,则直接运算;若匹配不了,则报错。
示例中,c为一维数组,其维度为(3,)。d为二维数组,维度为(1,3)。两者不同。
import numpy as np
from numpy.linalg import *
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[1,2,4],[6,8,0]])
c = np.array([1,3,5]) #一维数组
d = np.array([[2,4,6]]) #注意c与d 的区别
print(a,a.shape)
print(b,b.shape)
print(c,c.shape)
print(d,d.shape)
a =
[[1 2 3]
[4 5 6]
[7 8 9]] (3, 3)
b =
[[1 2 4]
[6 8 0]] (2, 3)
c =
[1 3 5] (3,)
d =
[[2 4 6]] (1, 3)
在对一维数组进行转置时,其shape不变。
print("a.T = \n",a.T,a.T.shape)
print("b.T = \n",b.T,b.T.shape)
print("c.T = \n",c.T,c.T.shape) #一维数组转置后,shape无变化
print("d.T = \n",d.T,d.T.shape)
a.T =
[[1 4 7]
[2 5 8]
[3 6 9]] (3, 3)
b.T =
[[1 6]
[2 8]
[4 0]] (3, 2)
c.T =
[1 3 5] (3,)
d.T =
[[2]
[4]
[6]] (3, 1)
在矩阵乘法中要保证对应维度一致,一维数组可以自动匹配维度,无需转置操作:
一维数组c可以左乘33矩阵,也可以右乘33矩阵,只要能匹配上,就能计算。
print(np.dot(a,c)) #可以计算,c的维度可以看做3*1
print(np.dot(c,a)) #可以计算,c的维度可以看做1*3
print(np.dot(b,c)) #可以计算,c的维度可以看做3*1
print(np.dot(c,b)) #无法计算,因为c的3个元素无法匹配b的第一个维度2
[22 49 76]
[48 57 66]
[27 30]
ValueError: shapes (3,) and (2,3) not aligned: 3 (dim 0) != 2 (dim 0)
二维数组d在进行矩阵乘法时,需要保证维度对应才行:
#print(np.dot(a,d)) #无法计算,d的维度是1*3,不匹配
print(np.dot(d,a)) #可以计算
#print(np.dot(b,d)) #无法计算
#print(np.dot(d,b)) #无法计算
ValueError: shapes (3,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
[[60 72 84]]
ValueError: shapes (2,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
ValueError: shapes (1,3) and (2,3) not aligned: 3 (dim 1) != 2 (dim 0)