2024-04-25 10:04:48 发布
网友
我想将一个形状数组(10,20)和一个形状矩阵(10,20)元素相乘,基本上是将每列乘以数组。你知道吗
但我有
ValueError: operands could not be broadcast together with shapes (20,) (20,10)
当我使用(10,10)矩阵和(10,)数组时,它确实起作用。你知道吗
我不希望使用for循环来优化算法所花费的时间。(此数组/矩阵运算在许多其他循环中都非常深入)
for
广播的第一个规则是最小维数的数组被展开,而展开发生在数组的前面。你知道吗
在(10,)*(10,20)情况下,有2个dim,因此第一个dim扩展到(1,10)。但这不能更改为匹配(10,20)。你知道吗
所以需要显式地将(10,)改为(10,1)。使用None最简单的方法。你知道吗
None
x[:,None]*y
注意,在MATLAB中,扩展发生在另一端。但是我不确定MATLAB是否已经开始广播了。八度音阶是几年前加的。你知道吗
==================
在(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]])
不同的结果。你知道吗
如果你想把2矩阵相乘,它们必须在数学和程序中有一个顺序
A => a x n B => n x b
你得到C = A x B会被塑造C => a x b
C = A x B
C => a x b
所以你的第一个数组必须是(1,10)乘以一个矩阵(10,20),你会得到一个数组(1,20)
为此,您可以transpose第一个数组
广播的第一个规则是最小维数的数组被展开,而展开发生在数组的前面。你知道吗
在(10,)*(10,20)情况下,有2个dim,因此第一个dim扩展到(1,10)。但这不能更改为匹配(10,20)。你知道吗
所以需要显式地将(10,)改为(10,1)。使用
None
最简单的方法。你知道吗注意,在MATLAB中,扩展发生在另一端。但是我不确定MATLAB是否已经开始广播了。八度音阶是几年前加的。你知道吗
==================
在(10,)*(10,10)情况下,=>;(1,10)*(10,10)=>;(10,10)
不同的结果。你知道吗
如果你想把2矩阵相乘,它们必须在数学和程序中有一个顺序
你得到
C = A x B
会被塑造C => a x b
所以你的第一个数组必须是(1,10)乘以一个矩阵(10,20),你会得到一个数组(1,20)
为此,您可以transpose第一个数组
相关问题 更多 >
编程相关推荐