2016-08-12 117 views
0

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

但我得到

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

当我使用(10,10)矩阵和(10)阵列它的工作。

我不想用for循环来做到这一点,以优化我的算法所花费的时间。 (该阵列/矩阵opreation远远深于其他许多环路)

+1

做'arr1 [:,无] * arr2'。 – Divakar

+0

要使广播能够正常工作,必须使用形状(10)到(10,1)来重新整形阵列。 Divakar的建议将起作用。 –

回答

2

广播的第一条规则是具有最小尺寸的阵列得到扩展 - 并且扩展发生在阵列的前端。 (10,)*(10,20)的情况下,有2个dim,所以第一个展开为(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]]) 

不同的结果。

+0

谢谢,效果很好!非常清楚的解释| – Doob

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你的第一个阵列

+1

您正在描述矩阵乘法,而不是元素乘法。 – hpaulj