我看到并执行了一个 python 程序,其中使用 a[:,j]
将矩阵切成列向量并传递给函数。列向量的维度为 40000x1
。在跟踪输出时,我在函数中打印了 a
的维度,它打印了 (40000,)
。在函数中,此矩阵与维度为 1x40000
的矩阵 b
相乘。我打印了结果的尺寸,它说结果也是 1x40000
。这怎么可能?我已经读到 a
将是一个列向量(显然)但是产品如何生成 1x40000
矩阵?它不满足矩阵乘法规则。我正在使用 numpy
。
编辑:
代码:
def update_state(xk, sk, wx, wRec):
print("Sizes:")
print(xk.shape)
print(wx.shape)
print((xk*wx).shape)
print((xk * wx + sk * wRec).shape)
return xk * wx + sk * wRec
def forward_states(X, wx, wRec):
S = np.zeros((X.shape[0], X.shape[1]+1))
for k in range(0, X.shape[1]):
S[:,k+1] = update_state(X[:,k], S[:,k], wx, wRec)
return S
输出:
Sizes:
(40000,)
(1, 40000)
(1, 40000)
(1, 40000)
最佳答案
我假设您指的是 numpy
包裹。还有其他可用于 Python 的数组包,但这似乎是最受欢迎的。
numpy
处理多维数组,而不是矩阵。一个很大的区别在于,N 个元素的一维数组可以解释为 Nx1 或 1xN 矩阵,具体取决于您选择如何解释它。
另一件需要注意的事情是函数 numpy.multiply
,也就是 *
运算符与 numpy.dot
不同,又名 @
运算符。您在代码中看到的涉及 *
的操作执行逐元素乘法,而不是您认为的矩阵乘法。
numpy
提供了许多不同的机制来将具有兼容维度的数组元素相互映射。在您的示例中使用的最常见方式称为 broadcasting .
让我们将链接中的信息应用到您代码中的操作kx * wx
。我将使用 kx
和 wx
的简化版本,这样可以更轻松地说明手头的问题:
>>> kx = np.arange(10)
>>> kx
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> kx.shape
(10,)
>>> wx = np.arange(10).reshape(1, 10)
>>> wx
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> wx.shape
(1, 10)
这里是相关广播规则的浓缩版:
When operating on two arrays, NumPy compares their shapes element-wise. It starts with the trailing dimensions, and works its way forward. Two dimensions are compatible when:
- they are equal, or
- one of them is 1
... The size of the resulting array is the maximum size along each dimension of the input arrays.
在您的例子中,(N,)
数组乘以 (1,N)
数组,得到 (1,N)
包含输入元素乘积的数组:
>>> >>> kx*wx
array([[ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81]])
这与矩阵乘法无关。其余的操作可以用相同的规则进行分析。
关于Python 矩阵表示为 (40000,),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37669714/