Numpy dotproduct奇怪的行为

时间:2017-11-30 22:14:35

标签: python numpy

我正在使用python3.5,我有疑问:为什么np.dot()表现得像这样?

>> a = np.array([[1,2,3,4]])
>> b = np.array([123])
>> np.dot(a,b)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: shapes (1,4) and (1,) not aligned: 4 (dim 1) != 1 (dim 0)
>>np.dot(b,a)
array([123, 246, 369, 492])

2 个答案:

答案 0 :(得分:2)

help(np.dot)开始,我们了解到,np.dot(x,y) x 的最后一个轴的总和产品,而倒数第二个y

如果是np.dot(a, b)a的最后一个轴是4,唯一的b轴的长度是1.它们不匹配:失败。

如果是np.dot(b, a)b的最后一个轴是1,a的倒数第二个轴是1.它们匹配:成功。

变通方法

根据您对np.dot(a,b)的意图,您可能需要:

>>> np.dot(a, np.resize(b,a.shape[-1]))
array([1230])

答案 1 :(得分:2)

来自numpy.dot(x, y)的{​​{3}}:

  

对于二维数组,它相当于矩阵乘法,对于一维数组到向量的内积...对于N维,它是x的最后一个轴上的和积,第二个是到y的最后一次:

所以,你有:

a = np.array([[1,2,3,4]])  # shape is (1, 4), 2-D array (matrix)
b = np.array([123])        # shape is (1,),   1-D array (vector)
  • np.dot(b, a)有效((1,) * (1, 4),相关尺寸同意)
  • np.dot(a, b)没有((1, 4) * (1,),相关尺寸不同意,操作未定义。请注意,倒数第二个&#39; (1,)的轴对应于其唯一的轴)

这与您有两个二维数组(即矩阵:

)的行为相同
a = np.array([[1,2,3,4]])  # shape is (1, 4)
b = np.array([[123]])      # shape is (1, 1)
  • np.dot(b, a)有效((1, 1) * (1, 4),内部矩阵维度一致)
  • np.dot(a, b)没有((1, 4) * (1, 1),内部矩阵维度不同意)

但是,如果你有两个1-D数组,即向量,则两个操作都不起作用:

a = np.array([1,2,3,4])   # shape is (4,)
b = np.array([123])       # shape is (1,)
  • np.dot(b, a)不起作用((1,) * (4,),但只能为相同长度的矢量定义内部产品)
  • np.dot(a, b)无效((4,) * (1),相同)