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

时间:2019-12-09 10:23:00

标签: python arrays numpy math mask

很抱歉,标题令人困惑,但是很难将我想做的事情放在一个句子中。图像您拥有一个stack N矩阵形式的图像堆栈m x n作为一个(m, n, N)形状的numpy数组。现在,如果我想沿堆栈轴numpy.median执行N,则非常简单: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)

必须有更好的方法。

2 个答案:

答案 0 :(得分:1)

您可以做的是使用非屏蔽值中的NaNs构建一个数组,然后计算np.nanmedian(忽略NaNs)。您可以使用np.where“动态”构建这样的数组:

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.]])

答案 1 :(得分:0)

我很难理解您要说的话,但是希望这会有所帮助:

您可以使用np.where查找和替换(或忽略/删除)要排除的值。

或者您可以使用bin_mask = stack != value_you_want_to_ignore获取一个布尔数组,该布尔数组可用于忽略关键值。