【问题标题】:1D Arrays elements一维数组元素
【发布时间】:2022-01-05 15:31:16
【问题描述】:

我正在做 numpy 基础知识,我正在尝试做一些矩阵乘法,我的数组 A 是 3 行 x 3 列,而我的数组 x 是 1 行 x 3 列(或者我想),我期待它给出一个错误,因为 A 的列数需要与 x 的行数相同,但它们不是因为 3 不是 1,但它给出了 [24 15 29],没有给出错误。所以,我很困惑一维数组是否有 1 行和 n 列,反之亦然。

import numpy as np

A = np.array([[4, 2, 1],[1, 3, 1],[2, 3, 6]])
x = np.array([4, 3, 2])

print(np.matmul(A, x))

【问题讨论】:

  • matmul(等效于dot)对一维数组有一个特殊的规则。所以 (n,3) 和 (3,) 很好,产生 (n,)

标签: python arrays numpy


【解决方案1】:

您还可以使用@ 符号进行矩阵乘法。如果你把数组变成矩阵,它可能会如你所愿

import numpy as np
A = np.array([[4, 2, 1],[1, 3, 1],[2, 3, 6]])
x = np.array([4, 3, 2])
print(A @ x) # 1D array of shape (3,)
print(A @ x[:, np.newaxis]) # 2D array of shape (3, 1)

B = np.matrix(A) # make into matrix
y = np.matrix(x) # make into matrix

#print(B @ y) # gives error, as now matrix multiplication cannot be done
print(B @ y.T) # 2D matrix with one column

【讨论】:

    【解决方案2】:

    如果你这样做,print(x.shape)) 你会看到你的数组的形状是 (3,)。意味着它是一个一维数组。

    语法np.array([4, 3, 2]) 用于制作一维数组(n,)。并不是说您的代码中只有一个方括号。

    如果您希望它是 1x3(二维),您必须这样做,np.array([[4,3,2]])

    在这里,你正在制作 (1,3) 或 1 行 3 列。

    [[4,3,2]]
    

    请注意,方括号内有一个方括号。外部方括号用于整个矩阵。其中的每个方括号代表一行,每个逗号分隔它代表另一行。

    您也可以像np.array([[4],[3],[2]]) 这样制作一个 3x1(二维)矩阵。看看如何有一个外部方括号,基本上你正在制作,(1,3) 或 3 行,1 列。

    [[4],
    [3],
    [2]]
    

    在您的示例中,matmul 将接受正确的维度或产生错误,因为您的一维数组具有正确的维度 (3,),因为 mxn 乘以 nxp 会产生一个 mxp 矩阵,并且 n = n必须是真的,它将您的数组投影为二维矩阵并进行计算,如果您已完成 (4,) 或 (3,) 的任何操作,它将无法正常工作。

    【讨论】:

    • 形状 (3,) 与 (3,1) 不同
    • 我的错,我要改了
    【解决方案3】:

    我认为这篇文章包含对您问题的回答: https://numpy.org/doc/stable/reference/generated/numpy.matmul.html

    即,使用numpy.matmul,会自动将第二维添加到一维向量中,从而可以进行乘法运算。引用链接页面:

    如果第一个参数是一维的,则通过在其维度前添加 1 将其提升为矩阵。在矩阵乘法之后,前面的 1 被删除。如果第二个参数是一维的,则通过在其维度上附加 1 将其提升为矩阵。矩阵乘法后,附加的 1 被删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2021-08-11
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      相关资源
      最近更新 更多