【问题标题】:Numpy - create matrix with rows of vectorNumpy - 用向量行创建矩阵
【发布时间】:2016-01-16 23:39:55
【问题描述】:

我有一个向量[x,y,z,q],我想创建一个矩阵:

[[x,y,z,q],
 [x,y,z,q],
 [x,y,z,q],
...
 [x,y,z,q]]

有 m 行。我认为这可以通过某种聪明的方式使用广播来完成,但我只能考虑使用 for 循环来完成。

【问题讨论】:

    标签: python python-2.7 numpy array-broadcasting


    【解决方案1】:

    在沿列添加m 零之后,当然可以使用broadcasting,就像这样 -

    np.zeros((m,1),dtype=vector.dtype) + vector
    

    现在,NumPy 已经为完全相同的任务提供了一个内置函数 np.tile -

    np.tile(vector,(m,1))
    

    示例运行 -

    In [496]: vector
    Out[496]: array([4, 5, 8, 2])
    
    In [497]: m = 5
    
    In [498]: np.zeros((m,1),dtype=vector.dtype) + vector
    Out[498]: 
    array([[4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2]])
    
    In [499]: np.tile(vector,(m,1))
    Out[499]: 
    array([[4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2]])
    

    你也可以在用np.newaxis/None扩展它的维度之后使用np.repeat来达到同样的效果,就像这样-

    In [510]: np.repeat(vector[None],m,axis=0)
    Out[510]: 
    array([[4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2]])
    

    您也可以使用integer array indexing 来获取复制,就像这样 -

    In [525]: vector[None][np.zeros(m,dtype=int)]
    Out[525]: 
    array([[4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2]])
    

    最后使用np.broadcast_to,您可以简单地在输入vector 中创建一个2D 视图,因此这几乎是免费的,并且不需要额外的内存。所以,我们只需这样做 -

    In [22]: np.broadcast_to(vector,(m,len(vector)))
    Out[22]: 
    array([[4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2]])
    

    运行时测试-

    这是一个比较各种方法的快速运行时测试 -

    In [12]: vector = np.random.rand(10000)
    
    In [13]: m = 10000
    
    In [14]: %timeit np.broadcast_to(vector,(m,len(vector)))
    100000 loops, best of 3: 3.4 µs per loop # virtually free!
    
    In [15]: %timeit np.zeros((m,1),dtype=vector.dtype) + vector
    10 loops, best of 3: 95.1 ms per loop
    
    In [16]: %timeit np.tile(vector,(m,1))
    10 loops, best of 3: 89.7 ms per loop
    
    In [17]: %timeit np.repeat(vector[None],m,axis=0)
    10 loops, best of 3: 86.2 ms per loop
    
    In [18]: %timeit vector[None][np.zeros(m,dtype=int)]
    10 loops, best of 3: 89.8 ms per loop
    

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 2017-11-18
      相关资源
      最近更新 更多