NumPy中运算符逐元素运算与矩阵运算的区别及结果差异
NumPy逐元素运算与矩阵运算的差异说明
NumPy官方文档专门对乘积类运算符的运算逻辑做了明确说明:
与诸多矩阵编程语言不同,NumPy数组中的乘积运算符
*执行逐元素运算,矩阵乘积运算可通过@运算符(Python >=3.5版本支持)或dot方法完成。
核心规则区别
- 底层计算逻辑不同:逐元素运算是数组按索引位置的独立计算,只要两个数组形状满足广播规则即可运算,计算时两个数组对应索引位置的元素单独做算术操作,不同位置的元素完全不产生关联;矩阵运算严格遵循线性代数矩阵乘法定义,要求第一个数组的最后一维长度与第二个数组的倒数第二维长度严格相等,计算时每个输出位置的值,是第一个数组对应行、第二个数组对应列的所有元素两两相乘后求和得到,元素间存在联动计算逻辑。
- 调用方式不同:逐元素乘法直接使用
*运算符即可,其余逐元素算术操作(加、减、除、取模、幂运算等)也都是直接用常规算术运算符作用在数组上;矩阵乘法必须使用@运算符,或者调用数组的.dot()方法实现,直接用*永远不会触发矩阵乘逻辑。 - 维度匹配规则不同:逐元素运算支持广播机制,比如形状为
(3,1)的数组和(1,4)的数组做逐元素运算,会自动按规则扩展成(3,4)的形状再计算;矩阵乘法不支持这类错位维度的自动扩展,维度不符合要求时会直接抛出ValueError报错。
实际运算结果差异
可以用最简单的二维数组示例直观看出区别:
import numpy as np # 定义两个2*2的测试数组 arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([[5, 6], [7, 8]]) # 逐元素乘 elem_result = arr1 * arr2 # 矩阵乘 mat_result = arr1 @ arr2
- 数值结果完全不同:逐元素乘的输出为
逻辑就是对应位置直接相乘:15=5、26=12、37=21、48=32。[[ 5 12] [21 32]]
矩阵乘的输出为
严格按矩阵乘法计算:比如左上角19 = 15 + 27,右上角22 = 16 + 28,其余位置同理。[[19 22] [43 50]] - 输出形状规则不同:逐元素运算的输出形状和广播后的数组形状一致,同形状数组运算后形状和原数组完全相同;矩阵乘的输出形状为「第一个数组除最后一维的前面所有维度 + 第二个数组的最后一维」,比如形状
(2,3)的数组和(3,4)的数组做矩阵乘,输出形状为(2,4),和原数组形状不一致。 - 运算性质不同:逐元素乘法满足交换律,
arr1 * arr2和arr2 * arr1结果完全一致;矩阵乘法一般不满足交换律,绝大多数场景下arr1 @ arr2和arr2 @ arr1结果不同,甚至可能因为维度不匹配根本无法运算。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

