it-swarm.com.de

Wie wende ich eine Maske von einem Array auf ein anderes Array an?

Ich habe die maskierte Array-Dokumentation jetzt mehrmals 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.

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]

Das funktioniert also gut ... aber um diese y-Achse zu zeichnen, brauche ich eine passende x-Achse. Wie wende ich die Maske vom y-Array auf das x-Array an? So etwas wäre sinnvoll, produziert aber Müll:

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

Also, wie um alles in der Welt ist das gemacht (beachten Sie, dass das neue x-Array ein neues Array sein muss).

Edit:

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

>>> 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 zu finden, die so elegant ist wie IDL ...

27
Balthasar

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 ist für Python 2.x

Wie von joris vorgeschlagen, erledigt dies auch die Arbeit new_x = x[~m.mask].copy(), die ein Array ergibt

>>> new_x
array([1, 2, 4])
17
kiriloff

Ich hatte ein ähnliches Problem, musste aber mehr Maskierungsbefehle und mehr Arrays laden, um sie anzuwenden. Meine Lösung ist, dass ich die gesamte Maskierung in einem Array durchführe und dann das endgültig maskierte Array als Bedingung im Befehl mask_where Verwende.

Beispielsweise:

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 diese Maske jetzt auf viele weitere Arrays anwenden können, ohne den Maskierungsprozess für jedes dieser Arrays durchlaufen zu müssen.

16
red_tiger