Когда у меня есть структурированный маскированный массив с булевой индексацией, при каких условиях я получаю представление и когда я получаю копию? В документации говорится, что расширенное индексирование всегда возвращает копировать, но это неверно, так как что-то вроде X[X>0]=42
это технически продвинутая индексация, но присваивание работает. У меня ситуация сложнее:
Я хочу установить маску определенного поля на основе критерия из другого поля, поэтому мне нужно получить поле, применить логическое индексирование и получить маску. Есть 3! = 6 заказов.
Подготовка:
In [83]: M = ma.MaskedArray(random.random(400).view("f8,f8,f8,f8")).reshape(10, 10)
In [84]: crit = M[:, 4]["f2"] > 0.5
Поле - индекс - маска (сбой):
In [85]: M["f3"][crit, 3].mask = True In [86]: print(M["f3"][crit, 3].mask) [False False False False False]
Индекс-поле-маска (сбой):
In [87]: M[crit, 3]["f3"].mask = True In [88]: print(M[crit, 3]["f3"].mask) [False False False False False]
Индекс - маска - поле (сбой):
In [94]: M[crit, 3].mask["f3"] = True In [95]: print(M[crit, 3].mask["f3"]) [False False False False False]
Маска - индекс - поле (сбой):
In [101]: M.mask[crit, 3]["f3"] = True In [102]: print(M.mask[crit, 3]["f3"]) [False False False False False]
Поле - маска - индекс (успешно):
In [103]: M["f3"].mask[crit, 3] = True In [104]: print(M["f3"].mask[crit, 3]) [ True True True True True] # set back to False so I can try method #6 In [105]: M["f3"].mask[crit, 3] = False In [106]: print(M["f3"].mask[crit, 3]) [False False False False False]
Маска - поле - индекс (успешно):
In [107]: M.mask["f3"][crit, 3] = True In [108]: print(M.mask["f3"][crit, 3]) [ True True True True True]
Таким образом, похоже, что индексирование должно быть последним.
__setitem__
v__getitem__
. Но я думаю, что здесь есть нюансы, которые требуют дальнейшего изучения — это структурированный массив и замаскированный. Итак, возникает вопрос о том, как индексация полей взаимодействует с индексацией элементов и как можно установитьmask
. Я предлагаю возобновить это. - person hpaulj   schedule 15.06.2016