2015-10-18 139 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是表現的方式!