我想将元素数组(10,)和形状矩阵(10,20)相乘,基本上将每列乘以数组。
但我得到了
ValueError: operands could not be broadcast together with shapes (20,) (20,10)
当我使用(10,10)矩阵和(10,)数组时,它确实有效。
我不想使用for
循环来优化算法所花费的时间。 (这个数组/矩阵的opreation在很多其他循环中都很深)
答案 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你的第一个阵列