必须按如下方式填充两个 numpy 数组:
[0 1 2]
[0 1 2]
[0 1 2]
[0 1 2]
[0 1 2]]
[[0 0 0]
[1 1 1]
[2 2 2]
[3 3 3]
[4 4 4]]
或者
第一个想法是:
ax=np.zeros((5,3),np.int16)
ay=np.zeros((5,3),np.int16)
for j in range(0,3):
for i in range(0,5):
ax[i,j]=j#filling ax with x=col
ay[i,j]=i#filling ay with y values y=li
第二个想法是:
bx = np.zeros((5,3),np.int16)
by = np.zeros((5,3),np.int16)
for j in range(3):
bx[:,j]=j
for i in range(5):
by[i,:]=i
我确信有更好的方法,哪一种? 谢谢 jp
最佳答案
我认为使用numpy.tile
可能会更好:
In [422]: np.tile((0,1,2), (5,1))
Out[422]:
array([[0, 1, 2],
[0, 1, 2],
[0, 1, 2],
[0, 1, 2],
[0, 1, 2]])
In [473]: tile(arange(5)[:,None], 3)
Out[473]:
array([[0, 0, 0],
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[4, 4, 4]])
时间效率:
对于形状为 (5,3) 的小矩阵,for 循环速度更快:
In [490]: timeit np.tile((0,1,2), (5,1))
10000 loops, best of 3: 38.3 us per loop
In [491]: %%timeit
...: bx = np.zeros((5,3),np.int16)
...: for j in range(3):
...: bx[:,j]=j
...:
100000 loops, best of 3: 16.5 us per loop
但对于形状较大的矩阵 (5, 1000),tile
更快:
In [488]: timeit n=1000; tile(xrange(n), (5,1))
1000 loops, best of 3: 313 us per loop
In [489]: %%timeit
...: n=1000
...: bx=zeros((5, n))
...: for j in range(n):
...: bx[:,j]=j
...:
100 loops, best of 3: 3.97 ms per loop
无论如何,tile
使代码更加简洁。
关于python - 如何使用矢量化代码用渐变填充 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21482728/