Python 矩阵表示为 (40000,)

标签 python numpy matrix

我看到并执行了一个 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。我将使用 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)

这里是相关广播规则的浓缩版:

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:

  1. they are equal, or
  2. 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/

相关文章:

python - OpenCV createCalibrateDebevec.process 给我 "dst is not a numpy array, neither a scalar"

java - AffineTransform 修改的形状呈现出与预期相反的效果

python - 数据帧上的逐元素三元条件运算

python - 可嵌套的超时装饰器? (即超时装饰函数调用超时装饰函数)

python - API 属性错误 - 模块对象没有属性 'UserViewSet' - Django Rest Framework

performance - 使用 'rows' 更快地替代 INTERSECT - MATLAB

sql-server - SQL 服务器 : how to split string to columns and rows with 2 delimiters?

python匹配目标词

python - 如何使 cython 函数接受 float 或 double 数组输入?

python - Matplotlib 全屏无法工作