很抱歉,标题令人困惑,但是很难将我想做的事情放在一个句子中。图像您拥有一个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)
必须有更好的方法。
答案 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
获取一个布尔数组,该布尔数组可用于忽略关键值。