2014-01-31 4 views
1

Два Numpy массивы должны быть заполнены следующим образом:Как заполнить массив 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]] 

Или enter image description here

Первой идея была:

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 

I я уверен, что есть лучший способ, какой? Благодаря JP

ответ

2

Я думаю, что с помощью 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), то для петли быстрее :

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 делает код понятнее.

+0

Отлично! Как делать тайм? –

+0

@ Жан-Пэт обновил – zhangxaochen

Смежные вопросы