【问题标题】:Fastest way to create a numpy matrix with multiples of a vector创建具有多个向量的 numpy 矩阵的最快方法
【发布时间】:2018-06-30 13:36:59
【问题描述】:

设 x,y 是两个包含 N 个元素的 numpy 数组。我想创建一个 numpy 矩阵,其列是 x 的缩放移位版本。例如,说

m=[0.2, 0.4, 1.2]

那我要矩阵

X = [0.2x+y, 0.4x+y, 1.2x+y]

最快(也是最简单,最简单的第二优先)方法是什么。

目前我正在做这样的事情。

ListVec = [m[i]*x+y for i in numpy.arange(len(m))]
X = numpy.array(ListVec).T

【问题讨论】:

    标签: python numpy


    【解决方案1】:
    import numpy as np 
    m = np.array([0.2, 0.4, 1.2])
    x = 5
    y = 3
    X = m*x+y
    

    这在 numpy 中称为broadcasting(既简单又快速;))

    【讨论】:

    • xy 是数组,而不是标量。
    • @hpaulj 我不确定。 OP 没有表明这一点,从描述来看,似乎 OP 正在寻找标量。无论如何,你和 CTZhu 也涵盖了数组案例。谢谢。
    【解决方案2】:

    当 X 和 Y 是数组时,使用 Einstein Summation

    In [70]: Y
    Out[76]: array([5, 6, 7, 8, 9])
    
    In [71]: X
    Out[71]: array([0, 1, 2, 3, 4])
    
    In [72]: m
    Out[72]: [0.2, 0.4, 1.2]
    
    In [73]: np.einsum('i,j', X, m)
    Out[73]: 
    array([[0. , 0. , 0. ],
           [0.2, 0.4, 1.2],
           [0.4, 0.8, 2.4],
           [0.6, 1.2, 3.6],
           [0.8, 1.6, 4.8]])
    
    In [74]: Y[...,np.newaxis] + np.einsum('i,j', X, m)
    Out[74]: 
    array([[ 5. ,  5. ,  5. ],
           [ 6.2,  6.4,  7.2],
           [ 7.4,  7.8,  9.4],
           [ 8.6,  9.2, 11.6],
           [ 9.8, 10.6, 13.8]])
    

    【讨论】:

      【解决方案3】:

      如果您给出示例 xy 以及 m 会有所帮助,但是:

      In [435]: x,y = np.array([1,2,3,4]), np.array([.1,.2,.3,.4])
      In [436]: m = [.2,.4,1.2]
      

      所以结果是(3,N):

      In [437]: np.array([i*x+y for i in m])
      Out[437]: 
      array([[0.3, 0.6, 0.9, 1.2],
             [0.5, 1. , 1.5, 2. ],
             [1.3, 2.6, 3.9, 5.2]])
      

      广播m:

      In [438]: np.array(m)[:,None]*x + y
      Out[438]: 
      array([[0.3, 0.6, 0.9, 1.2],
             [0.5, 1. , 1.5, 2. ],
             [1.3, 2.6, 3.9, 5.2]])
      

      哎呀,我错过了你的转置,

      In [440]: np.array(m)*x[:,None] + y[:,None]
      Out[440]: 
      array([[0.3, 0.5, 1.3],
             [0.6, 1. , 2.6],
             [0.9, 1.5, 3.9],
             [1.2, 2. , 5.2]])
      

      我会继续将转置应用到 [438]

      【讨论】:

        猜你喜欢
        • 2021-12-11
        • 1970-01-01
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        相关资源
        最近更新 更多