我想乘以一个形状(10,)的阵列和形状(10,20)的矩阵,基本上乘以每个列的数组。乘以元素阵列和矩形矩阵
但我得到
ValueError: operands could not be broadcast together with shapes (20,) (20,10)
当我使用(10,10)矩阵和(10)阵列它的工作。
我不想用for
循环来做到这一点,以优化我的算法所花费的时间。 (该阵列/矩阵opreation远远深于其他许多环路)
我想乘以一个形状(10,)的阵列和形状(10,20)的矩阵,基本上乘以每个列的数组。乘以元素阵列和矩形矩阵
但我得到
ValueError: operands could not be broadcast together with shapes (20,) (20,10)
当我使用(10,10)矩阵和(10)阵列它的工作。
我不想用for
循环来做到这一点,以优化我的算法所花费的时间。 (该阵列/矩阵opreation远远深于其他许多环路)
广播的第一条规则是具有最小尺寸的阵列得到扩展 - 并且扩展发生在阵列的前端。 (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]])
不同的结果。
谢谢,效果很好!非常清楚的解释| – Doob
做'arr1 [:,无] * arr2'。 – Divakar
要使广播能够正常工作,必须使用形状(10)到(10,1)来重新整形阵列。 Divakar的建议将起作用。 –