2017-08-18 1 views
1

I einen booleschen Maske habe, die als 2-D numpy Array (Boolean Array) bestehenalle Elemente in einem Array Löschen, um Boolesche entsprechenden Maske

array([[ True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True], 
     [False, False, False, False, False, False, False], 
     [False, False, False, False, False, False, False], 
     [False, False, False, False, False, False, False]], dtype=bool) 

Ich habe auch einen separaten 2-D numpy Array von Werten, die (Array Values) ist mit den gleichen Abmessungen wie der booleschen Maske

array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005], 
     [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ], 
     [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ], 
     [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245], 
     [ 21.7495, 19.614 , 20.3025, 21.706 , 22.853 , 19.623 , 16.7415], 
     [ 20.9715, 21.9505, 21.1895, 21.471 , 21.0445, 21.096 , 19.3295], 
     [ 24.3815, 26.2095, 25.3595, 22.9985, 21.586 , 23.796 , 20.375 ]]) 

Was würde ich zu tun ist, alle Elemente aus dem Array von Werten zu löschen, wo die gleiche Stelle in dem booleschen Bereich False entspricht. Gibt es einen einfachen Weg, dies zu tun?

Die gewünschte Ausgabe für dieses Beispiel ist:

array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005], 
     [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ], 
     [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ], 
     [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245]]) 

In diesem speziellen Beispiel sind alle False Werte existieren am Ende des dem Booleschen Array, aber dies ist nicht immer der Fall, und sie können zufällig sein, verteilt. Daher brauche ich eine Art und Weise jedes Element aus der Werte-Array des Löschens in denen der entsprechende Maskenwert entspricht False in der Booleschen Array

+1

Werden ganze Zeilen wahr oder falsch sein? Oder wird es eine Mischung geben? –

+2

Wenn meine Antwort hilft, könntest du es akzeptieren (https://stackoverflow.com/help/someone-answers) oder mir sagen, was falsch war, damit ich es beheben kann. –

+0

'Arr [Maske] 'macht eine solche Auswahl.Das Ergebnis wird 1d sein, da im Allgemeinen eine solche Maske eine unterschiedliche Anzahl von Werten für jede Zeile auswählen könnte. In einigen Fällen können Sie das Ergebnis in ein sinnvolles 2D-Array umformen. – hpaulj

Antwort

2

Für die meisten Zwecke können Sie einfach einen MaskedArray schaffen, die so verhält, als ob diese „entfernt“ wurden, das erlaubt auch einzelne Elemente aus einer Spalte/Zeile „entfernen“, während die Dimensionalität halten die gleich:

import numpy as np 
arr = np.array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005], 
       [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ], 
       [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ], 
       [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245], 
       [ 21.7495, 19.614 , 20.3025, 21.706 , 22.853 , 19.623 , 16.7415], 
       [ 20.9715, 21.9505, 21.1895, 21.471 , 21.0445, 21.096 , 19.3295], 
       [ 24.3815, 26.2095, 25.3595, 22.9985, 21.586 , 23.796 , 20.375 ]]) 
mask = np.array([[ True, True, True, True, True, True, True], 
       [ True, True, True, True, True, True, True], 
       [ True, True, True, True, True, True, True], 
       [ True, True, True, True, True, True, True], 
       [False, False, False, False, False, False, False], 
       [False, False, False, False, False, False, False], 
       [False, False, False, False, False, False, False]]) 
marr = np.ma.MaskedArray(arr, mask=~mask) 
marr 

Gibt:

masked_array(data = 
[[19.189 23.2535 23.1555 23.4655 22.6795 20.3295 19.7005] 
[20.688 20.537 23.8465 21.2265 24.5805 25.842 23.198] 
[22.418 21.0115 21.0355 20.217 24.1275 24.4595 21.981] 
[21.156 18.6195 23.299 22.5535 23.2305 28.749 21.0245] 
[-- -- -- -- -- -- --] 
[-- -- -- -- -- -- --] 
[-- -- -- -- -- -- --]], 
      mask = 
[[False False False False False False False] 
[False False False False False False False] 
[False False False False False False False] 
[False False False False False False False] 
[ True True True True True True True] 
[ True True True True True True True] 
[ True True True True True True True]], 
     fill_value = 1e+20) 

In diesem Fall wäre es auch möglich sein, nur um alle Zeilen zu komprimieren, die mit np.ma.compress_rows mindestens ein maskierten Element enthalten:

>>> np.ma.compress_rows(marr) 
array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005], 
     [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ], 
     [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ], 
     [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245]]) 
1

Maske Unter der Annahme wird aus Zeilen bestehen, die entweder alle True sind, oder alle False, dann können Sie verwenden mask.all(axis=1) und Index:

In [116]: x 
Out[116]: 
array([[ 1., 0., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0., 0., 1.]]) 

In [117]: x[mask.all(axis=1)] 
Out[117]: 
array([[ 1., 0., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0.]]) 
1

meinen Kommentar zu veranschaulichen:

arr[mask] ist 1d, weil im Allgemeinen diese Auswahl nicht zurückkehrt eine ordentliche 2d-Anordnung.

In [36]: arr[mask] 
Out[36]: array([ 0, 1, 3, 4, 6, 7, 9, 10]) 

Wir dies eindeutig mit dem maskierten Array Lösung

In [39]: marr.compressed() 
Out[39]: array([ 0, 1, 3, 4, 6, 7, 9, 10]) 

Mit 8 Bedingungen sehen kann ich es (4,2)

In [37]: marr = np.ma.MaskedArray(arr,mask=~mask) 
In [38]: marr 
Out[38]: 
masked_array(data = 
[[0 1 -- 3] 
[4 -- 6 7] 
[-- 9 10 --]], 
      mask = 
[[False False True False] 
[False True False False] 
[ True False False True]], 
     fill_value = 999999) 

ma Druck kehrt die 1D-Array umformen kann , aber nichts mit 3.

Sie können ganze Zeilen oder Spalten mit verschiedenen Kombinationen maskieren s von any oder all.

Verwandte Themen