2016-10-20 3 views
1

Ich möchte mehrere Masken auf einem großen Array zusammenführen, das nicht die gleiche Größe hat. Die zweiten Masken werden nach dem Anwenden der ersten Maske usw. auf eine beliebige Anzahl von Masken hergestellt. Als Beispiel lassen Sie uns sagen, dass wir die folgende Array und eine Maske von ihm erstellen:Mehrere Masken mit verschiedenen Größen zusammenführen

A = np.arange(10) 
mask1 = (A <= 5) 

Jetzt wollen wir eine andere Maske anzuwenden, sondern nur auf die Daten durch mask1 gehen, wie folgt aus:

mask2 = (A[mask1] % 2 == 0) 

Um die unmaskierten Daten erhalten Sie tun können:

D = A[mask1][mask2] 

wenn Sie jedoch eine beliebige Anzahl von Masken, die jeweils nach der letzten Maske angewendet wurde wäre es ziemlich umständlich bekommen. Gibt es eine bequeme Möglichkeit, die Masken zusammenzuführen, obwohl sie nicht die gleiche Größe haben, aber aus demselben Array aufgebaut sind?

Offensichtlich konnte ich tun,

mask = (A <= 5 & A % 2 == 0) 

aber das ist nicht möglich, mit den Daten, mit denen ich arbeite, wie ich brauche, um schrittweise Masken anwenden. sonst wäre es einfach zu langsam.

Vielen Dank im Voraus.

+0

Wenn Sie eine Liste solcher Masken haben, könnten Sie Schleife durch und bei jeder Wiederholung erhalten Scheiben. Also, etwas wie 'A = A [mask_each_iteration]' oder um das Eingangsarray nicht zu zerstören, kopiere 'A' in ein Ausgangsarray: out = A.copy() 'und mache dann solch ein Slicing in einer Schleife? Da 'mask2' von' mask1' usw. abhängt, benötigen Sie einen iterativen Prozess. – Divakar

+0

Ich denke, die folgenden funktionieren würde: 'total_mask = np.zeros (len (mask1))' ' q = 0 ' ' for i in range (len (mask1)): '' wenn mask1 [i] == 1: ' ' total_mask [i] = (maske2 [q] == 1) ' ' q + = 1' Das scheint nicht ein sehr schöner Weg, es zu tun, aber es könnte nur Arbeit. – user7012893

Antwort

0

Sie könnten diese gültigen Indizes speichern und bei jeder Iteration in die vorherigen Indizes mit den aktuellen Indizes basierend auf den vorherigen Indizes indexieren, um die aktuellen Indizes basierend auf Positionen im ursprünglichen Eingabearray zu erhalten.

So konnten wir tun -

idx1 = np.flatnonzero(mask1) # Store indices 
idx2 = np.flatnonzero(mask2) 
final_idx = idx1[idx2] 

Wir final_idx indizieren in dem Eingangsfeld für die Endauswahl verwenden würde.

Um das zu einer generischen Anzahl von Masken verlängern würde, der iterative Prozess wie folgt aussehen -

list_of_masks = [mask1,mask2,mask3] 
idx = np.arange(A.shape[0]) 
for m in list_of_masks: 
    idx = idx[np.flatnonzero(m)] 

Probelauf -

In [104]: A = np.arange(20) 

In [105]: # Let's create three iterative masks 
    ...: mask1 = (A <= 5) 
    ...: mask1[1] = 0 
    ...: mask1[2] = 0 
    ...: mask2 = (A[mask1] % 2 == 0) 
    ...: mask3 = (A[mask1][mask2] % 3 == 0) 
    ...: 

In [106]: A[mask1][mask2][mask3] # Original approach 
Out[106]: array([0]) 

In [107]: list_of_masks = [mask1,mask2,mask3] 
    ...: idx = np.arange(A.shape[0]) 
    ...: for m in list_of_masks: 
    ...:  idx = idx[np.flatnonzero(m)] 
    ...:  

In [108]: A[idx] # New approach to use final idx 
Out[108]: array([0]) 
Verwandte Themen