2015-10-18 75 views
2

的行矩阵I具有矢量[x,y,z,q]和我想创建一个矩阵:numpy的 - 创建矢量

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

具有m行。我认为这可以通过广播以一种聪明的方式完成,但我只能想到用for循环做这件事。与m零增加沿着列,像这样经过

回答

2

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.repeat延长其尺寸后np.newaxis/None达到相同的效果,像这样 -

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]]) 

运行时测试 -

下面是一个快速运行时测试,比较早期文章中列出的四种方法:

In [542]: vector = np.random.rand(100) 

In [543]: m = 100 

In [544]: %timeit np.zeros((m,1),dtype=vector.dtype) + vector 
10000 loops, best of 3: 38.7 µs per loop 

In [545]: %timeit np.tile(vector,(m,1)) 
10000 loops, best of 3: 22.5 µs per loop 

In [546]: %timeit np.repeat(vector[None],m,axis=0) 
100000 loops, best of 3: 15.7 µs per loop 

In [547]: %timeit vector[None][np.zeros(m,dtype=int)] 
1000 loops, best of 3: 209 µs per loop 

看起来像np.repeat是表现的方式!