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
是表现的方式!