2016-07-05 17 views
6

sagen, dass ich eine zweidimensionale Anordnung von Koordinaten, die bisher so etwas wieWie maskiert man ein numpliges 2D-Array?

x = array([[1,2],[2,3],[3,4]])

Früher in meiner Arbeit sieht, habe ich eine Maske erzeugt, wie der Blick etwas endet

mask = [False,False,True]

Wenn ich versuche, diese Maske für den 2D-Koordinatenvektor zu verwenden, erhalte ich einen Fehler

was macht Sinn, nehme ich an. Also habe ich versucht, einfach die folgende Maske verwenden statt:

mask2 = np.column_stack((mask,mask)) 
newX = np.ma.compressed(np.ma.masked_array(x,mask2)) 

Und was ich ganz nah ist:

>>>array([1,2,2,3])

zu dem, was ich erwarten würde (und will):

>>>array([[1,2],[2,3]])

Es muss einen einfacheren Weg geben, dies zu tun?

Antwort

5

Ist das wonach Sie suchen?

import numpy as np 
x[~np.array(mask)] 
# array([[1, 2], 
#  [2, 3]]) 

Oder von numpy masked array:

newX = np.ma.array(x, mask = np.column_stack((mask, mask))) 
newX 

# masked_array(data = 
# [[1 2] 
# [2 3] 
# [-- --]], 
#    mask = 
# [[False False] 
# [False False] 
# [ True True]], 
#  fill_value = 999999) 
+0

Ah ich sehe, also was ich versuchte, funktioniert, ich kann es nur nicht komprimieren. Hm. Gibt es eine Möglichkeit, maskierte Elemente eines Arrays zu entfernen, ohne die Dimensionalität des Arrays zu verlieren? 'np.ma.compressed()' tut beides. – Anonymous

+0

Ich mache auch nicht viel über maskierte Arrays, wahrscheinlich das gleiche Niveau wie du. Ich versuche nur, es zum Laufen zu bringen. Nun, wenn Sie versuchen, Elemente zu entfernen, denke ich, Logik-Index ist kein schlechter Weg. – Psidom

1

In Ihrem letzten Beispiel ist das Problem nicht die Maske. Es ist Ihre Verwendung von compressed. Vom docstring von compressed:

Return all the non-masked data as a 1-D array. 

So flacht compressed die nicht maskierten Werte in einen 1-d-Array. (Es muss, weil es keine Garantie dafür gibt, dass die komprimierten Daten werden eine n-dimensionale Struktur aufweisen.)

Werfen Sie einen Blick auf die maskierte Array, bevor Sie es komprimieren:

In [8]: np.ma.masked_array(x, mask2) 

Out[8]: 
masked_array(data = 
[[1 2] 
[2 3] 
[-- --]], 
      mask = 
[[False False] 
[False False] 
[ True True]], 
     fill_value = 999999) 
+0

Sie haben Recht, es ist korrekt, bevor ich es komprimiere. Ich werde die Dokumentation für eine Möglichkeit lesen, um maskierte Elemente zu entfernen und dabei die Dimensionalität der Arrays beizubehalten. Danke – Anonymous

+0

Wenn ich verstehe, was Sie versuchen zu tun, sieht @ Psidoms erster Vorschlag vernünftig aus. Insbesondere benötigen Sie wahrscheinlich kein maskiertes Array. Indexieren Sie einfach ein reguläres Array mit einem booleschen Array. –

4

Ihre x ist 3x2 :

In [379]: x 
Out[379]: 
array([[1, 2], 
     [2, 3], 
     [3, 4]]) 

einen 3 Element boolean Maske Marke:

In [380]: rowmask=np.array([False,False,True]) 

Das kann verwendet werden, um die Zeilen auszuwählen, in denen es True ist oder wo es False ist. In beiden Fällen ist das Ergebnis 2d:

In [381]: x[rowmask,:] 
Out[381]: array([[3, 4]]) 

In [382]: x[~rowmask,:] 
Out[382]: 
array([[1, 2], 
     [2, 3]]) 

Dies ist ohne Verwendung der MaskedArray-Unterklasse. Um ein solches Array zu erstellen, benötigen wir eine Maske, die in ihrer Form x entspricht. Es ist nicht vorgesehen, nur eine Dimension zu maskieren.

In [393]: xmask=np.stack((rowmask,rowmask),-1) # column stack 

In [394]: xmask 
Out[394]: 
array([[False, False], 
     [False, False], 
     [ True, True]], dtype=bool) 

In [395]: np.ma.MaskedArray(x,xmask) 
Out[395]: 
masked_array(data = 
[[1 2] 
[2 3] 
[-- --]], 
      mask = 
[[False False] 
[False False] 
[ True True]], 
     fill_value = 999999) 

Anwenden compressed den Array erzeugt ein raveled: array([1, 2, 2, 3])

Da Maskierung durch Element-Element, ist es ein Element in der Zeile 1, 2 in Zeile 2 usw. So im allgemeinen compressing maskieren könnte, das Entfernen von maskierte Elemente, ergibt kein 2d-Array. Die abgeflachte Form ist die einzige allgemeine Wahl.

np.ma macht am meisten Sinn, wenn es eine Streuung von maskierten Werten gibt. Es ist nicht von großem Wert, wenn Sie ganze Zeilen oder Spalten auswählen oder deren Auswahl aufheben möchten.

===============

Hier sind weitere typische maskierte Arrays:

In [403]: np.ma.masked_inside(x,2,3) 
Out[403]: 
masked_array(data = 
[[1 --] 
[-- --] 
[-- 4]], 
      mask = 
[[False True] 
[ True True] 
[ True False]], 
     fill_value = 999999) 

In [404]: np.ma.masked_equal(x,2) 
Out[404]: 
masked_array(data = 
[[1 --] 
[-- 3] 
[3 4]], 
      mask = 
[[False True] 
[ True False] 
[False False]], 
     fill_value = 2) 

In [406]: np.ma.masked_outside(x,2,3) 
Out[406]: 
masked_array(data = 
[[-- 2] 
[2 3] 
[3 --]], 
      mask = 
[[ True False] 
[False False] 
[False True]], 
     fill_value = 999999) 
0

Da keine dieser Lösungen für mich gearbeitet, dachte ich schreiben Was für eine Lösung, vielleicht wird es für jemand anderen nützlich sein. Ich benutze Python 3.x und ich arbeitete an zwei 3D-Arrays. Eine, die ich data_3D nenne, enthält Float-Werte von Aufzeichnungen in einem Gehirn-Scan, und die andere, template_3D enthält Ganzzahlen, die Bereiche des Gehirns darstellen. Ich wollte diese Werte von data_3D entsprechend einen ganzzahligen region_code wie pro template_3D wählen:

my_mask = np.in1d(template_3D, region_code).reshape(template_3D.shape) 
data_3D_masked = data_3D[my_mask] 

, die mir einen 1D-Array aus nur relevanten Aufnahmen gibt.

Verwandte Themen