2013-05-11 5 views
21

Ich habe die maskierte Array-Dokumentation jetzt mehrere Male gelesen, überall gesucht und mich gründlich dumm gefühlt. Ich kann für das Leben in mir nicht herausfinden, wie man eine Maske von einem Array auf ein anderes anwendet.Wie man eine Maske von einem Array auf ein anderes Array anwendet?

Beispiel:

import numpy as np 

y = np.array([2,1,5,2])   # y axis 
x = np.array([1,2,3,4])   # x axis 
m = np.ma.masked_where(y>2, y) # filter out values larger than 5 
print m 
[2 1 -- 2] 
print np.ma.compressed(m) 
[2 1 2] 

Also das funktioniert gut .... aber diese y-Achse zu zeichnen, muss ich eine passende x-Achse. Wie lege ich die Maske vom Y-Array auf das X-Array an? So etwas wie dies würde Sinn machen, sondern produziert Müll:

new_x = x[m.mask].copy() 
new_x 
array([5]) 

So, wie auf der Erde ist, dass done (beachten Sie die neue x-Array muss ein neues Array sein).

Edit:

Nun scheint es eine Möglichkeit, dies funktioniert wie folgt zu tun:

>>> import numpy as np 
>>> x = np.array([1,2,3,4]) 
>>> y = np.array([2,1,5,2]) 
>>> m = np.ma.masked_where(y>2, y) 
>>> new_x = np.ma.masked_array(x, m.mask) 
>>> print np.ma.compressed(new_x) 
[1 2 4] 

Aber das ist unglaublich chaotisch! Ich versuche, eine Lösung so elegant wie IDL zu finden ...

+0

Kannst du nicht einfach wie "plot (x, m)" plotten, ohne ein neues_x zu machen? – joris

+3

Und es ist 'new_x = x [~ m.mask] .copy()'. Beachten Sie das '~', da die Maske True ist, wo der Wert maskiert ist. – joris

+0

Nein, ich kann das nicht einfach in einen Plot-Befehl einfügen, weil die Daten vorher massiert werden müssen, also brauche ich wirklich Zugang zu den ausgewählten Daten in mehreren Achsen. – Balthasar

Antwort

14

Warum nicht einfach

import numpy as np 

y = np.array([2,1,5,2])   # y axis 
x = np.array([1,2,3,4])   # x axis 
m = np.ma.masked_where(y>2, y) # filter out values larger than 5 
print list(m) 
print np.ma.compressed(m) 

# mask x the same way 
m_ = np.ma.masked_where(y>2, x) # filter out values larger than 5 
# print here the list 
print list(m_) 
print np.ma.compressed(m_) 

Code für Python 2.x ist

Auch, wie von Joris vorgeschlagen, tun dies die arbeiten new_x = x[~m.mask].copy() einen Array geben

>>> new_x 
array([1, 2, 4]) 
+0

Gute Sachen auch, danke. Ich bin offensichtlich neu in Python und leide meinen Weg durch ... – Balthasar

+0

Es kann helfen, Ihre Antworten zu vermeiden, die Worte "einfach", "nur" usw. –

10

ich ein ähnliches Problem hatte, aber die Lasten mehr Maskierungsbefehle und mehr Arrays sie anzuwenden. Meine Lösung ist, dass ich die gesamte Maskierung auf einem Array mache und dann das endgültig maskierte Array als Bedingung im mask_where Befehl verwende.

Zum Beispiel:

y = np.array([2,1,5,2])       # y axis 
x = np.array([1,2,3,4])       # x axis 
m = np.ma.masked_where(y>5, y)     # filter out values larger than 5 
new_x = np.ma.masked_where(np.ma.getmask(m), x) # applies the mask of m on x 

Das Schöne daran ist, dass Sie jetzt diese Maske auf viele weitere Anordnungen, ohne durch den Maskierungsprozess für jeden von ihnen anwenden können.

Verwandte Themen