2013-12-12 2 views
1

Есть ли удобный способ добавить другой массив с фактическими значениями в замаскированные позиции в другом массиве?Добавить вместе два массива с маской размером

import numpy as np 
arr1 = np.ma.array([0,1,0], mask=[True, False, True]) 
arr2 = np.ma.array([2,3,0], mask=[False, False, True]) 
arr1+arr2 

Out[4]: 
masked_array(data = [-- 4 --], 
     mask = [ True False True], 
    fill_value = 999999) 

Примечание: в arr2 значение 2 не маскируется -> должно быть в полученном массиве Результат должен быть [2, 4, -]. Я думаю, что для этого должно быть простое решение?

+0

Я нахожу ваш вопрос запутанным. вы вводите данные как '[- 4 -]', и вы ожидаете '[2, 4, -]' в качестве вывода? Какова его логика? –

+1

Значение 2 в arr2 не замаскировано, поэтому оно должно быть включено в результат. Почему маска в arr1 «выигрывает»? – HyperCube

+0

также добавлены маски, а 'bool (False + True)' is True –

ответ

5

Попробуйте это (выбор логического оператора, который вы хотите использовать для масок из http://docs.python.org/3/library/operator.html)

>>> from operator import and_ 
>>> np.ma.array(arr1.data+arr2.data,mask=map(and_,arr1.mask,arr2.mask)) 
masked_array(data = [2 4 --], 
      mask = [False False True], 
     fill_value = 999999) 

В Python 3, map() возвращает итератор, а не список, поэтому необходимо добавить list():

>>> np.ma.array(arr1.data+arr2.data,mask=list(map(and_,arr1.mask,arr2.mask))) 
+0

Спасибо! Это работает. – HyperCube

Смежные вопросы