【问题标题】:Matrix multiplying arrays with Numpy使用 Numpy 矩阵乘法数组
【发布时间】:2013-10-24 10:34:47
【问题描述】:

我有一个 5x5 的数组,我正在尝试将一行的转置矩阵与另一行相乘。

import numpy as np
a = np.array([1, 4, 6, 4, 1])
b = np.array([-1, -2, 0, 2, 1])
c = np.array([-1, 2, 0, -2, 1])
d = np.array([-1, 0, 2, 0, -1])
e = np.array([1, -4, 6, -4, 1]) 
f = np.vstack([a, b, c, d, e])

result = np.dot(f[1, :].T, f[1, :])

我认为这会起作用,但显然

f[1, :].T

最终变成

[-1, -2, 0, 2, 1]

而不是

[[-1]
 [-2]
 [ 0]
 [ 2]
 [ 1]]

因此np.dot 将其视为真正的点积,而不是进行矩阵乘法。

我发现列表切片,其中一个索引是整数,所有其他索引都是 :s 将维度减少一,所以 f[1, :] 的形状不是 (1, 5) 而是 (5,),所以转置它确实没有。

我已经能够使用f[1, :].reshape((1, 5)) 让它工作,但是有没有更好的方法呢?我是否错过了一种无需重塑即可获得转置的简单方法?

【问题讨论】:

    标签: python arrays numpy matrix


    【解决方案1】:

    可以在切片时使用np.newaxis添加维度,以补偿否则丢失的维度。

    f[1, :, np.newaxis]
    

    生成您想要的单列二维数组。将np.newaxis 放在冒号前会得到一个单行二维数组。

    【讨论】:

      【解决方案2】:

      对于 numpy 数组,拥有这种行为通常是有利的,为了避免这种情况,您总是可以使用 numpy 矩阵类。

      >>> f = np.matrix(f)
      >>> f
      matrix([[ 1,  4,  6,  4,  1],
              [-1, -2,  0,  2,  1],
              [-1,  2,  0, -2,  1],
              [-1,  0,  2,  0, -1],
              [ 1, -4,  6, -4,  1]])
      
      >>> f[1,:].T
      matrix([[-1],
              [-2],
              [ 0],
              [ 2],
              [ 1]])
      
      >>> np.dot(f[1, :].T, f[1, :])
      matrix([[ 1,  2,  0, -2, -1],
              [ 2,  4,  0, -4, -2],
              [ 0,  0,  0,  0,  0],
              [-2, -4,  0,  4,  2],
              [-1, -2,  0,  2,  1]])
      

      由于这是矩阵类* 将表示矩阵乘法,因此您可以简单地使用:

      f[1,:].T * f[1,:]
      

      您也可以考虑np.outer 进行此类操作:

      >>> np.outer(f[1,:],f[1,:])
      array([[ 1,  2,  0, -2, -1],
             [ 2,  4,  0, -4, -2],
             [ 0,  0,  0,  0,  0],
             [-2, -4,  0,  4,  2],
             [-1, -2,  0,  2,  1]])
      

      【讨论】:

        【解决方案3】:

        如果您希望各个切片保留它们的“矩阵性”,那么您应该将 f 转换为 numpy.matrix,这样可以保留矩阵性。

         fm = numpy.matrix(f)
        

        然后

        numpy.dot(fm[1,:].T,fm[1,:])
        

        将返回一个 nxn 矩阵

        【讨论】:

        • 这正是我发布的,为什么要重做?
        • 简单,我们几乎同时提交了答案。
        【解决方案4】:

        根据接受的答案,我更喜欢使用None 而不是np.newaxis,这对我的口味来说有点冗长。例如,

        f[:,None]
        

        f[:,np.newaxis] 做同样的事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-31
          • 2018-05-24
          相关资源
          最近更新 更多