Python3 NumPy中np.dot矩阵乘法运算规则与维度消解详解
本文详解Python3中NumPy库np.dot函数的运算规则。重点解析矩阵乘法中维度匹配的n=x条件、非交换律特性,以及结果Shape通过消解相等维度生成的规律。同时对比列表、数组与矩阵的区别,以及*、np.multiply与np.dot在逐元素乘法与矩阵乘法上的差异,帮助开发者准确判断数组形状并避免运算错误。
Python中np.dot(a,b)的运算规则解析
首先需明确,dot运算不满足交换律,即np.dot(a, b)与np.dot(b, a)的结果通常不同。
此外,np.dot(a,b)与a.dot(b)的执行结果是一致的。
1. NumPy中数组相乘np.dot(a,b)的运算条件
针对两个数组a和b:
示例一:
a = np.array([[3], [3], [3]]) # (3,1) b = np.array([2, 2, 1]) # (3,) print(a, "\na的shape", a.shape) print(b, "\nb的shape", b.shape) c = b.dot(a) print(c, "\nc的shape", c.shape)
输出:
[3] [3]] a的shape (3, 1) [2 2 1] b的shape (3,) [15] c的shape (1,)
示例二:
a = np.array([[2,2,2,1],[3,3,3,1],[4,4,4,4]]) # shape=(3,4) b = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]]) # shape=(4,3)
可直接观察它们的shape属性:a的shape为(3, 4),记为(m, n);b的shape为(4, 3),记为(x, y)。
对于上述两个数组a和b:
np.dot(a, b)的运算前提条件是n等于x。若a的shape变为(4, 3),则两者无法进行dot运算。
简而言之,规律如下:若a.shape=(m,n),b.shape=(x,y),则np.dot(a,b)的运算条件为n=x。这一规则可用于在Python中快速判断数组shape是否匹配正确。
实际上,通过可视化数组运算过程,其逻辑如下:

2. np.dot(a,b)运算后的结果解析
规律:dot运算会将两组数组中相等(符合dot条件)的维度消去,剩余维度组合成新的数组。若剩余仅有一个维度,则结果为行向量(对应一维),列维度视为无。
对于a.shape=(m,n),b.shape=(x,y):
dot运算后,n和x被消去,结果shape变为(m,y)。
如果n为1(或为空),shape变为(y,)。
例如1:
a = np.array([1,1,1]) # shape=(3,)
b = np.array([[3],[3],[3]]) # shape=(3,1)
print(np.dot(a,b))
print("dot之后的shape为:", np.dot(a,b).shape)
此时3和3消去,剩余一个数值1,对应1行且无列,即shape为(1,)。
运算结果:
[9] dot之后的shape为:(1,)
例如2:
a.shape=(4,1) b.shape=(1,4)
此时1和1消去,剩余shape为(4,4)。
np.dot(a,b)的shape为(4,4)
补充:Python3中的列表、数组和矩阵及*、np.dot和np.multiply解析
今日使用Python进行数据处理时,发现对Python中列表和数组的区别及其运算规则存在混淆,常导致结果不符合预期。因此查阅相关资料,发现许多资料讲解较为片面,现结合多方资料进行详细总结:
1. 列表、数组和矩阵
列表是Python中最基础的数据结构,可存储数字、字符串等任意元素,因此Python可通过列表存储数组;
数组是Python扩展库Numpy中的一种数据结构ndarray;
矩阵同样是Python扩展库Numpy中的一种数据结构mat;
既然存在列表,为何不直接使用Python中的列表,而使用Numpy?原因显而易见:Python中列表的存储效率和输入输出性能远不及Numpy中的数组和矩阵。但由于列表可存储任意元素,其通用性优于数组和矩阵。总之,列表与数组、矩阵各有优势,需视使用场合选择合适的数据结构。
同样,Numpy中的数组和矩阵也存在区别:
Numpy中的矩阵必须是2维的,而Numpy中数组可以是多维的,因此矩阵是数组的一个特例,在Numpy中矩阵继承着数组的所有特性;
同时,我们常需查看列表、数组和矩阵的属性,如size、shape、len。
其中len():返回对象的长度,可作用于列表、数组和矩阵:len(list([1,2,3]))。
size()和shape()是Numpy扩展库中特有的函数:
size():计算所有数据的个数,同样可作用于列表、数组和矩阵:np.size(np.array([1,2,3]))。
shape():获取数据每维的大小,同样可作用于列表、数组和矩阵:np.shape(np.array([1,2,3]))。
不同于len,shape和size还可作为数组和矩阵的属性(列表不支持),使用方法如下:a.shape、a.size。
2. Python中的星号(*)、np.multiply()、np.dot()
1. 星号(*):
对数组执行对应位置相乘;对矩阵执行矩阵乘法运算。
2. np.multiply()
无论对矩阵还是数组,均执行对应位置相乘。
3. np.dot()
对秩为1的数组:执行对应位置相乘并求和。
对秩不为1的数组:执行矩阵乘法运算。
对矩阵:执行矩阵乘法运算。
上述内容是对列表、数组、矩阵以及Python中各种乘法运算的总结。通过总结,对问题的理解更为清晰,现在已明确它们的用法,希望这篇博客也能帮助到大家。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。如有错误或未考虑完全的地方,望不吝赐教。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









