Подтвердить что ты не робот

Как применить маску от одного массива к другому массиву?

Я читал документацию в маске массива несколько раз, искал везде и чувствовал себя полностью глупо. Я не могу понять всю жизнь во мне, как применять маску от одного массива к другому.

Пример:

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]

Итак, это прекрасно работает... но для построения этой оси y мне нужна соответствующая ось x. Как применить маску из массива y к массиву x? Что-то вроде этого имеет смысл, но производит мусор:

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

Итак, как это делается (обратите внимание, что новый массив x должен быть новым массивом).

Edit:

Ну, похоже, один способ сделать это работает следующим образом:

>>> 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]

Но это невероятно грязно! Я пытаюсь найти решение столь же изящным, как IDL...

4b9b3361

Ответ 1

Почему бы просто не

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_)

код для Python 2.x

Также, как было предложено joris, это делает работу new_x = x[~m.mask].copy(), дающую массив

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

Ответ 2

У меня была аналогичная проблема, но с привлечением большего количества команд маскирования и большего количества массивов для их применения. Мое решение состоит в том, что я делаю все маскирование на одном массиве, а затем использую маску в конце маски как условие в команде mask_where.

Например:

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

Самое приятное, что теперь вы можете применить эту маску к множеству других массивов, не пройдя процесс маскировки для каждого из них.