在执行 numpy 操作时,有没有一种快速的方法可以忽略数组的某些值?

Is there a quick way to ignore certain values of an array when performing numpy operations?

抱歉,如果标题令人困惑,但很难用一句话表达我想做的事情。图像你有一个图像堆栈 stack N m x n 矩阵作为 (m, n, N) 形状的 numpy 数组。现在,如果我想沿堆栈轴 N 执行 numpy.median,这非常简单:numpy.median(stack, 0)。问题是对于堆栈中的每个图像,我还有一个我不想包含在操作中的像素掩码,在本例中为 numpy.median。有什么有效的方法吗?

到目前为止,我能想到的就是这个,但是难以置信慢而且绝对不可行:

median = [[]]*images[0].flatten().shape
for i in range(len(images)):
    image = images[i].flatten()
    mask = mask[i].flatten()
    for j in range(len(median)):
        if mask[j] == 0:
            median[j].append(image[j])
for i in range(len(median)):
    median[j] = np.median(median[j]) if median[j] else 0

median = np.array(median).reshape(images[0].shape)

必须有更好的方法。

我很难理解你想说什么,但希望这会有所帮助:

您可以使用 np.where 来查找和替换 - 或 ignore/remove - 您想要排除的值。

或者您可以使用 bin_mask = stack != value_you_want_to_ignore 获取一个布尔数组,您可以使用它来忽略临界值。

你可以做的是构建一个在非屏蔽值中具有 NaNs 的数组并计算 np.nanmedian(忽略 NaNs)。您可以使用 np.where:

构建这样一个数组 "on the fly"
x = np.arange(4*3*4).reshape((4,3,4))
m = x%2 == 0
np.nanmedian(np.where(m, x, np.NaN), axis=2)
>>array([[ 1.,  5.,  9.],
       [13., 17., 21.],
       [25., 29., 33.],
       [37., 41., 45.]])