2012-11-19 13 views
6

Jak "wyrzeźbić" lub ukryć tablicę 2D numpy według formuły indeksu? Nie obchodzi mnie, jaka jest wartość elementu, tylko jego pozycja w tablicy.carving 2D numpy array według indeksu

Na przykład, podać mxm tablicą, w jaki sposób wyodrębnić wszystkie elementy, których adres jest zgodny

for i in range(0,m): 
    for j in range(0,m): 
     if j-i-k>=0: 
      A[i,j] = 1 
     elif j-p-k>=0: 
      A[i,j] = 1 
     elif i-k>=0: 
      A[i,j] = 1 
     else: 
      A[i,j] = 0 
     j=j+1 
    i=i+1 

gdzie

k i p są arbitralne ogrodzenia

Załóżmy

k<m 
p<m 

Ta kończy się wyglądem jak przekątna + plaster poziomy + a pionowy plasterek. Czy można to zrobić bez powyższych pętli for?

+0

Dalsze pytanie na new_data = dane [maska] @tcaswell, używając mojego „za” utworzoną maskę „usuwa” niektórych wierszach i kolumnach i jakoś zostawia mnie z wektorem , a nie tablica oryginalnego data.shape. Czemu? Jak mogę temu zapobiec? – Hokiexterra

Odpowiedz

1
xdim,ydim = data.shape 
k = 2 
a, b = np.meshgrid(range(ydim),range(xdim)) 
mask = (b - a -k) < 0 

new_data = data[mask] 

new_data2 = np.array(data) # to force a copy 
new_data2[~mask] = 0 

new_data jest wektorem, ponieważ procesy maskujące (opracowane w ten sposób) spłaszcza tablicy. Wybieramy kształt z postrzępionym, który nie może być reprezentowany jako tablica. Jeśli chcesz ustawić wartości niewybrane na 0, użyj new_data2.

+0

Dalsze pytanie na temat – Hokiexterra

+0

@ user1836722 patrz edycja. – tacaswell

+0

Dzięki, spróbuję! – Hokiexterra

3
In [1]: import numpy as np 

In [2]: k = 2 

In [3]: i, j = np.ogrid[0:5,0:5] 

In [4]: mask = (j-i-k < 0) 

In [5]: mask 
Out[5]: 
array([[ True, True, False, False, False], 
     [ True, True, True, False, False], 
     [ True, True, True, True, False], 
     [ True, True, True, True, True], 
     [ True, True, True, True, True]], dtype=bool) 

In [6]: mask.shape 
Out[6]: (5, 5) 

In [7]: mask.dtype 
Out[7]: dtype('bool') 
1

Oto kolejny sposób korzystania np.indices:

>>> import numpy as np 
>>> a = np.arange(90).reshape(10,9) 
>>> b = np.indices(a.shape) 
>>> k = 2 
>>> i = b[1] - b[0] - k 
>>> a[i < 0] 
array([ 0, 1, 9, 10, 11, 18, 19, 20, 21, 27, 28, 29, 30, 31, 36, 37, 38, 
    39, 40, 41, 45, 46, 47, 48, 49, 50, 51, 54, 55, 56, 57, 58, 59, 60, 
    61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 
    79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) 
+0

+1, ponieważ nauczyłem się czegoś – tacaswell