2012-06-20 9 views
6

Ich habe eine 800x800-Array und ich möchte nur die Elemente im äußeren Teil davon analysieren. Ich brauche ein neues Array ohne die Elemente der Scheibe [5: -5,5: -5]. Es muss nicht unbedingt ein 2d-Array zurückgeben, ein flacher Array oder eine Liste wird auch funktionieren. Beispiel:Wie entfernt man eine 2D-Array-Teilmenge?

import numpy 

>>> a = numpy.arange(1,10) 
array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 

>>> a.shape = (3,3) 
array([[1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9]]) 

Ich brauche die Kernelemente zu verwerfen, so etwas wie:

del a[1:2,1:2] 

ich zu erwarten haben:

array([1, 2, 3, 4, 6, 7, 8, 9]) 

Ich versuchte numpy.delete() zu verwenden, aber es scheint für jeweils eine Achse zu funktionieren. Ich frage mich, ob es einen einfacheren Weg gibt, dies zu tun.

Antwort

2

Sie können den mittleren Bereich mit einigen Platzhalter Wert ersetzen (I verwendet -12345, alles, was nicht in Ihren aktuellen Daten auftreten kann funktionieren würde), dann alles auswählen, die nicht gleich den Wert ist:

>>> import numpy as np 
>>> a = np.arange(1,26) 
>>> a.shape = (5,5) 
>>> a 
array([[ 1, 2, 3, 4, 5], 
     [ 6, 7, 8, 9, 10], 
     [11, 12, 13, 14, 15], 
     [16, 17, 18, 19, 20], 
     [21, 22, 23, 24, 25]]) 

>>> a[1:4,1:4] = -12345 
>>> a 
array([[  1,  2,  3,  4,  5], 
     [  6, -12345, -12345, -12345,  10], 
     [ 11, -12345, -12345, -12345,  15], 
     [ 16, -12345, -12345, -12345,  20], 
     [ 21,  22,  23,  24,  25]]) 
>>> a[a != -12345] 
array([ 1, 2, 3, 4, 5, 6, 10, 11, 15, 16, 20, 21, 22, 23, 24, 25]) 

Wenn Sie eine float-Array verwenden, anstatt ein integer-Array, können Sie es ein wenig mehr elegant tun, indem NaN und isfinite mit:

>>> a = np.arange(1,26).astype('float32') 
>>> a.shape = (5,5) 
>>> a[1:4,1:4] = np.nan 
>>> a 
array([[ 1., 2., 3., 4., 5.], 
     [ 6., nan, nan, nan, 10.], 
     [ 11., nan, nan, nan, 15.], 
     [ 16., nan, nan, nan, 20.], 
     [ 21., 22., 23., 24., 25.]], dtype=float32) 
>>> a[np.isfinite(a)] 
array([ 1., 2., 3., 4., 5., 6., 10., 11., 15., 16., 20., 
    21., 22., 23., 24., 25.], dtype=float32) 
6

Sie einen boolean-Array-Index Ihr Array, wie Sie möchten verwenden können. Auf diese Weise müssen Sie keine Werte in Ihrem ursprünglichen Array ändern, wenn Sie dies nicht möchten. Hier ist ein einfaches Beispiel:

>>> import numpy as np 
>>> a = np.arange(1,10).reshape(3,3) 
>>> b = a.astype(bool) 
>>> b[1:2,1:2] = False 
>>> b 
array([[ True, True, True], 
     [ True, False, True], 
     [ True, True, True]], dtype=bool) 
>>> a[b] 
array([1, 2, 3, 4, 6, 7, 8, 9]) 
+0

gute Wahl, weil ich nicht de Original-Array zu ändern, und es gibt keine Notwendigkeit, den Inhalt des Arrays – user1470350

+0

@ user1470350 wissen - ja, es ist ein schöner Weg, Dinge zu tun :) – fraxel

Verwandte Themen