在执行 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.]])
抱歉,如果标题令人困惑,但很难用一句话表达我想做的事情。图像你有一个图像堆栈 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
:
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.]])