У меня есть два (или более) массива 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
.
Есть ли чистый способ сделать это?
Под «ненулевым», вы имеете в виду не-нан? – user2357112
Возможно, вы захотите взглянуть на [маскированные маски] (http://docs.scipy.org/doc/numpy/reference/maskedarray.html). – user2357112
Да, не-не-номер (нан), извините, что делал много работы с базами данных в последнее время. – monkut