乘元素阵列和矩形矩阵

时间:2016-08-12 21:56:03

标签: python arrays numpy matrix

我想将元素数组(10,)和形状矩阵(10,20)相乘,基本上将每列乘以数组。

但我得到了

  

ValueError: operands could not be broadcast together with shapes (20,) (20,10)

当我使用(10,10)矩阵和(10,)数组时,它确实有效。

我不想使用for循环来优化算法所花费的时间。 (这个数组/矩阵的opreation在很多其他循环中都很深)

2 个答案:

答案 0 :(得分:2)

广播的第一条规则是扩展尺寸最小的阵列 - 扩展发生在阵列的前面。

在(10,)*(10,20)情况下,有2个暗淡,所以第一个扩展为(1,10)。但是,这不能改变为匹配(10,20)。

所以你需要明确地将(10,)更改为(10,1)。使用None的最简单方法。

x[:,None]*y

注意,在MATLAB中,扩展发生在另一端。但我不确定MATLAB是否还有广播。 Octave几年前加入了它。

=====

在(10,)*(10,10)情况下,=> (1,10)*(10,10)=> (10,10)

In [1403]: np.arange(4)*np.ones((4,4),int)
Out[1403]: 
array([[0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3]])

In [1404]: np.arange(4)[:,None]*np.ones((4,4),int)
Out[1404]: 
array([[0, 0, 0, 0],
       [1, 1, 1, 1],
       [2, 2, 2, 2],
       [3, 3, 3, 3]])

不同的结果。

答案 1 :(得分:0)

如果你想要乘以2矩阵,他们必须在数学和程序中有一个订单

A => a x n 
B => n x b

您将C = A x B塑造C => a x b

所以你的第一个数组必须是(1,10)乘以一个矩阵(10,20)你会得到一个数组(1,20)

要做到这一点,你可以transpose你的第一个阵列