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
零增加沿着列,像這樣經過
的行矩陣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
零增加沿着列,像這樣經過
與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
是表現的方式!