2016-02-02 2 views
0

Я пытаюсь найти эффективный способ генерации набора координат xy, который идентифицирует каждую позицию в квадратной решетке, так что если решетка составлена из NxN сеток, гдеЭффективный способ создания перестановочного 2D-массива с целым числом

N = 100; x = range(N) 

Я хочу, чтобы вычислить набор массивов, таких как array([[0,0], [0,1], [0,2] ..[0,100], [1,0], [1,1], [1,2], ..[1,100], ...[100,0], [100,1], [100,2], ..[100,100]]). Заказ не имеет значения. До сих пор я пробовал использовать itertools.product(x, repeat=2), однако выходной объект itertools нелегко преобразовать в вышеописанный 2D-массив. Любое предложение действительно поможет.

+0

Что вы подразумеваете под заказ, не имеет значения? –

ответ

2

NumPy решение может быть:

X,Y = np.meshgrid(np.arange(0,100), np.arange(0,100)) 
result = np.vstack((Y.ravel(), X.ravel())).T 
result 
# array([[ 0, 0], 
#  [ 0, 1], 
#  [ 0, 2], 
#   ..., 

Что выглядит значительно быстрее, чем питон образом:

In [3]: %%timeit 
    ...: X,Y = np.meshgrid(np.arange(0,100), np.arange(0,100)) 
    ...: result = np.vstack((Y.ravel(), X.ravel())).T 
    ...: 
10000 loops, best of 3: 109 µs per loop 

In [4]: %%timeit 
    ...: N = 100 
    ...: result = np.array([[x, y] for x in range(N) for y in range(N)]) 
    ...: 
100 loops, best of 3: 6.54 ms per loop 

In [7]: %timeit result = list(itertools.product(range(100),repeat=2)) 
1000 loops, best of 3: 521 µs per loop 
3

Попробуйте N = 100; result = [[x, y] for x in range(N) for y in range(N)]

2

На самом деле, я думаю, что ты прибил его, Все, что вам нужно сделать, это конвертировать итератор в список, который является тривиальным:

y = list(itertools.product(x,repeat=2)) 
0
arr = np.arange(101) 
coords = np.transpose([np.repeat(arr, arr.size),np.tile(arr, arr.size)]) 

print(coords) 
1

все быстрее и быстрее при минимизации копий:

def matnp(n):  
    a=np.arange(n) 
    b=np.empty((2*n,n),a.dtype) 
    b[:n]=np.tile(a,n).reshape(n,n) 
    b[n:]=b[:n].T  
    return b.reshape(2,n*n).T 

тест:

In [11]: %timeit matnp(101) 
10000 loops, best of 3: 54 µs per loop 

и Numba:

from numba import jit 
@jit 
def matnb(n): 
    a=np.empty((n*n,2),np.int) 
    k=0 
    for i in range(n): 
     for j in range(n): 
      a[k]=i,j 
      k=k+1 
    return a 

тест:

In [15]: %timeit matnb(101) 
10000 loops, best of 3: 31.9 µs per loop 
Смежные вопросы