我已经看过并执行了一个python程序,其中使用a[:,j]
将矩阵切成列向量并传递给函数。列向量的维度为40000x1
。在跟踪输出时,我在函数中打印了a
的尺寸,并打印了(40000,)
。在函数中,此矩阵乘以维b
的矩阵1x40000
。我打印了结果的维度,结果也是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)
答案 0 :(得分:1)
我假设您指的是numpy
包。还有其他可用于Python的数组包,但这似乎是最受欢迎的数组包。
numpy
处理多维数组,而不是矩阵。 N个元素的一维数组可以解释为Nx1或1xN矩阵,具体取决于您选择如何解释它。
要注意的另一件事是numpy.multiply
函数,a.k.a。*
运算符与numpy.dot
不同,a.k.a是@
运算符。您在代码中看到的涉及*
的操作会按照您的想法进行逐元素乘法,而不是矩阵乘法。
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)
以下是相关广播规则的精简版本:
在两个数组上运行时,NumPy会逐元素地比较它们的形状。它从尾随尺寸开始,并向前发展。在以下情况下兼容两个维度:
- 他们是平等的,或
- 其中一个是1
醇>...结果数组的大小是输入数组每个维度的最大大小。
在您的情况下,(N,)
数组乘以(1,N)
数组,从而生成一个(1,N)
数组,其中包含输入的元素乘积:
>>> >>> kx*wx
array([[ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81]])
这与矩阵乘法无关。其余的操作可以通过相同的规则进行分析。
答案 1 :(得分:0)
所以wx
是(1,N),X
是2d; S
是相同的,但还有一列。
X[:,k]
xk
是(N,)(1d),sk
xk * wx + sk * wRec
是(N,)*(1,N) + (N,)*?
;
(N,)
会自动扩展为(1,N)
,因此update_state
的结果也是(1,N)
。将其分配给S[:,k+1]
应该有效,因为可以根据需要在开头添加1
维度。
In [120]: x=np.zeros((3,4),int)
In [121]: x[:,0]=np.ones((1,3),int)
In [122]: x
Out[122]:
array([[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0]])
(N,1)
分配会产生问题:
In [123]: x[:,0]=np.ones((3,1),int)
...
ValueError: could not broadcast input array from shape (3,1) into shape (3)
广播(N,)
形状可以与(1,N)
一起使用,但不适用于(N,1)
。
(相比之下,MATLAB总是至少2d,如果需要,最后可以在最后增加尺寸。)
请注意,我避免使用行或列向量术语;形状元组更清晰。