我有两个(或更多)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,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
。
有没有一种干净的方法来做到这一点?
测试 Not Not-A-Number(非 NAN):
from numpy import isnan
result = ~isnan(arr_a) * ~isnan(arr_b)
或者,如果您想同时排除 NAN 和无穷大,则运行:
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) 位置为真。
我是一名优秀的程序员,十分优秀!