逐元素乘以数组和矩形矩阵

2024-04-25 10:04:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将一个形状数组(10,20)和一个形状矩阵(10,20)元素相乘,基本上是将每列乘以数组。你知道吗

但我有

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

当我使用(10,10)矩阵和(10,)数组时,它确实起作用。你知道吗

我不希望使用for循环来优化算法所花费的时间。(此数组/矩阵运算在许多其他循环中都非常深入)


Tags: 算法元素forwithnot矩阵数组be
2条回答

广播的第一个规则是最小维数的数组被展开,而展开发生在数组的前面。你知道吗

在(10,)*(10,20)情况下,有2个dim,因此第一个dim扩展到(1,10)。但这不能更改为匹配(10,20)。你知道吗

所以需要显式地将(10,)改为(10,1)。使用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

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

为此,您可以transpose第一个数组

相关问题 更多 >