【问题标题】:How to create matrix with vector multiplication [duplicate]如何使用向量乘法创建矩阵[重复]
【发布时间】:2019-01-08 16:26:18
【问题描述】:

我正在尝试通过像x * x^T 这样的矩阵乘法,从大小为 2 的向量 x 创建一个 2x2 数组:

>>> x = np.array([2, 2])
>>> x
array([2, 2])
>>> np.matmul(x,x.T)
8

如您所见,这失败了。我想出了这个解决方案:

>>> m = np.matrix(x)
>>> m
matrix([[2, 2]])
>>> m.T
matrix([[2],
        [2]])
>>> np.matmul(m.T, m)
matrix([[4, 4],
        [4, 4]])

这实现了我想要的。但是有没有更好的方法来做到这一点,最好不要使用np.matrix

编辑:由于问题之外的上下文,不能创建 2x1 向量。

【问题讨论】:

  • np.outer(x, x)?
  • 您实际上并不需要使用matrix,但您需要有一个可以为您提供所需结果形状的形状。 x = np.array([[2, 2]]) 为您提供(1, 2) 的形状,您可以将其与np.matmul(x.T,x) 相乘
  • 请注意,这里并没有真正的“2x1 向量”,而是像x.shape 这样的一维向量返回(2,)

标签: python numpy


【解决方案1】:

使用np.outer:

np.outer(x, x)
# array([[4, 4],
#        [4, 4]])

或者,increase x's dimension by 1 在调用 np.matmul 之前:

x = x[:, None]  # x = x.reshape(-1, 1)
x.shape
# (2, 1)

x @ x.T  # (2,1) . (1,2) => (2,2)
# array([[4, 4],
#        [4, 4]])

【讨论】:

  • 我认为使用reshape 会比你建议的更清楚地增加x 的尺寸:x.reshape(1,2)
【解决方案2】:

如果你重塑了x,你可以使用@ 运算符来做乘法:

x = np.array([2, 2])
Xprime = x.reshape(len(x), 1)
print(Xprime @ Xprime.T)
#[[4 4]
# [4 4]]

【讨论】:

    【解决方案3】:

    np.array([2, 2]) 不会创建 2x1 向量,它会创建 2 向量。如果你想要一个 2x1 矩阵,你需要np.array([[2], [2]])。或者您可以使用 np.array([[2, 2]]) 创建一个 1x2 矩阵,然后执行 np.matmul(x.T,x)

    【讨论】:

      【解决方案4】:

      这里没有 2x1 向量,而是 1D 向量。您可以通过以下方式看到:

      > x.shape
      (2,)
      

      要实际创建一个 2x1 向量,请添加大括号:

      > x = np.array([[2, 2]])
      > x.shape
      (1,2)
      

      现在你有你想要的:

      > np.matmul(x.T,x)
      array([[4, 4],
             [4, 4]])
      

      x.T@x 在 Python3 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 2016-02-22
        • 2020-10-29
        相关资源
        最近更新 更多