Python矩阵表示为(40000,)

时间:2016-06-07 02:48:44

标签: python numpy matrix

我已经看过并执行了一个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)

2 个答案:

答案 0 :(得分:1)

我假设您指的是numpy包。还有其他可用于Python的数组包,但这似乎是最受欢迎的数组包。

numpy处理多维数组,而不是矩阵。 N个元素的一维数组可以解释为Nx1或1xN矩阵,具体取决于您选择如何解释它。

要注意的另一件事是numpy.multiply函数,a.k.a。*运算符与numpy.dot不同,a.k.a是@运算符。您在代码中看到的涉及*的操作会按照您的想法进行逐元素乘法,而不是矩阵乘法。

numpy提供了许多不同的机制,用于将具有兼容维度的数组元素相互映射。在您的示例中使用的最常见方式称为broadcasting

让我们将链接中的信息应用到代码中的操作kx * wx。我将使用kxwx的简化版本,以便更轻松地说明手头的问题:

>>> 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. 他们是平等的,或
  2.   
  3. 其中一个是1
  4.         

    ...结果数组的大小是输入数组每个维度的最大大小。

在您的情况下,(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,如果需要,最后可以在最后增加尺寸。)

请注意,我避免使用行或列向量术语;形状元组更清晰。