numpy: ndenumerate для замаскированных массивов? - PullRequest
5 голосов
/ 24 декабря 2011

Есть ли способ перечислить немаскированные местоположения маскируемого numpy ndarray (например, так, как это делает ndenumerate для обычного ndarrays, но опуская все маскированные записи)?

РЕДАКТИРОВАТЬ: точнее: перечисление должно не только пропускать замаскированные записи, но также показывать индексы немаскированных в исходном массиве.Например, если первые пять элементов 1-го массива замаскированы, а следующий имеет немаскированное значение 3, тогда перечисление должно начинаться с чего-то вроде ((5,), 3), ....

Спасибо!

PS: обратите внимание, что, хотя можно применить ndenumerate к маскированному ndarray, результирующее перечисление не делает различий между его маскированными и обычными записями.Фактически, ndenumerate не только не отфильтровывает маскированные записи из перечисления, но даже не заменяет перечисленные значения константой masked.Поэтому нельзя приспособить ndenumerate для этой задачи, просто обернув ndenumerate подходящим фильтром.

Ответы [ 2 ]

7 голосов
/ 24 декабря 2011

Вы можете получить доступ только к действительным записям, используя инверсию маски в качестве индекса:

>>> import numpy as np
>>> import numpy.ma as ma
>>> x = np.array([11, 22, -1, 44])
>>> m_arr = ma.masked_array(x, mask=[0, 0, 1, 0])
>>> for index, i in np.ndenumerate(m_arr[~m_arr.mask]): 
        print index, i
(0,) 11
(1,) 22
(2,) 44

Подробнее см. это .

Перечисление только допустимых записей с индексами из исходного массива:

>>> for (index, val), m in zip(np.ndenumerate(m_arr), m_arr.mask):
      if not m:
        print index, val 
(0,) 11
(1,) 22
(3,) 44
2 голосов
/ 24 декабря 2011

Как насчет:

import numpy as np
import itertools

def maenumerate(marr):
    mask = ~marr.mask.ravel()
    for i, m in itertools.izip(np.ndenumerate(marr), mask):
        if m: yield i

N = 12
a = np.arange(N).reshape(2, 2, 3)+10

b = np.ma.array(a, mask = (a%5 == 0))
for i, val in maenumerate(b):
    print i, val

, что дает

(0, 0, 1) 11
(0, 0, 2) 12
(0, 1, 0) 13
(0, 1, 1) 14
(1, 0, 0) 16
(1, 0, 1) 17
(1, 0, 2) 18
(1, 1, 0) 19
(1, 1, 2) 21
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...