2012-11-19 9 views
6

Wie "schnitze" oder maskiere ich ein 2D-Numpy-Array nach einer Indexformel? Es ist mir egal, was der Elementwert ist, nur seine Position im Array.2D-Numpy-Array nach Index zerlegen

Zum Beispiel gegeben eine mxm Matrix, wie extrahieren I alle Elemente, deren Adresse entspricht

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 

wo

k und p ein willkürlicher Zäunen

Angenommen

k<m 
p<m 

Dies endet wie eine diagonale Scheibe + eine horizontale Scheibe + a vertikale Scheibe. Kann es ohne die oben genannten for-Schleifen gemacht werden?

+0

Weitere Frage auf new_data = data [Maske] @tcaswell, meine „für“ erstellt Maske „entfernt“ einige Zeilen und Spalten und lässt mich irgendwie mit einem Vektor , kein Array der ursprünglichen data.shape. Warum? Wie kann ich das verhindern? – Hokiexterra

Antwort

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 ist ein Vektor, da die Maskierungsverfahren (auf diese Weise durchgeführt), um das Array abflacht. Sie wählen eine Form mit einem Ragged, die nicht als Array dargestellt werden kann. Wenn Sie nur die nicht ausgewählten Werte auf 0 setzen möchten, verwenden Sie new_data2.

+0

Weitere Frage auf – Hokiexterra

+0

@ user1836722 siehe bearbeiten. – tacaswell

+0

Danke, ich werde das versuchen! – 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

Hier ist noch eine weitere Möglichkeit np.indices mit:

>>> 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 weil ich etwas gelernt habe – tacaswell