2013-12-16 5 views
3

У меня есть два (или более) массива numpy, в которых мне нужно выполнить калибровку по каждой ячейке, где все соответствующие позиции ячейки имеют ненулевые значения.создать маску пересечений неиннальных матриц

import numpy 

arr_a = numpy.zeros(shape=(5,6)) 
arr_a.fill(numpy.nan) 
arr_b = numpy.zeros(shape=(5,6)) 
arr_b.fill(numpy.nan) 

arr_a[1,1] = 12.9 
arr_b[1,1] = 99.2 
arr_b[1,2] = 99.2 

Пример:

arr_a: 
array([[ nan, nan, nan, nan, nan, nan], 
     [ nan, 12.9, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan]]) 

arr_b: 
array([[ nan, nan, nan, nan, nan, nan], 
     [ nan, 99.2, 99.2, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan]]) 

Так с приведенным выше примером, я ожидаю только одна ячейки (1,1), чтобы соответствовать.

В принципе, я хочу сделать что-то вроде этого:

results = defaultdict(list) 
mask = numpy.logical_and(arr_a, arr_b) 
for arr in (a, b): 
    # filter out non-overlapping values 
    filtered_arr = arr.apply(mask) 
    for cell in numpy.nditer(filtered_arr[filtered_arr != numpy.nan]): 
     result = big_calc(filtered_arr[cell]) 
     results[cell].append(result) 

до сих пор не совсем имеет висит NumPy

Я пытался использовать numpy.logical_and(arr_a, arr_b), но это только кажется, что возвращается все True.

Есть ли чистый способ сделать это?

+0

Под «ненулевым», вы имеете в виду не-нан? – user2357112

+0

Возможно, вы захотите взглянуть на [маскированные маски] (http://docs.scipy.org/doc/numpy/reference/maskedarray.html). – user2357112

+0

Да, не-не-номер (нан), извините, что делал много работы с базами данных в последнее время. – monkut

ответ

5

Чтобы проверить не Not-A-Number (не NAN):

from numpy import isnan 
result = ~isnan(arr_a) * ~isnan(arr_b) 

В качестве альтернативы, если вы хотите, чтобы исключить оба Nans и бесконечности, а затем запустить:

from numpy import isfinite 
isfinite(arr_a) * isfinite(arr_b) 

На вашем контрольные массивы, оба указанных выше возврата:

array([[False, False, False, False, False, False], 
     [False, True, False, False, False, False], 
     [False, False, False, False, False, False], 
     [False, False, False, False, False, False], 
     [False, False, False, False, False, False]], dtype=bool) 

, который является Истинным только в положении (1, 1).

+2

Я бы ожидал, что оператор не будет лучше, чем '== 0':' ~ isnan (arr_a) ', а не' isnan (arr_a) == 0'. – mgilson

+0

@mgilson Спасибо. Ответ обновлен. – John1024

+2

Я бы написал логическое И как '&' вместо менее явного '*'. Скорость выполнения одинакова для обоих (с NumPy 1.8), но имеет более явные вопросы: поскольку '&' существует именно для этой цели, лучше всего использовать ее. – EOL

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