numpy 列表中的正整数之和为负

de90aj5v  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(155)

我正在尝试计算图像中不同区域的亮度(16位)。我首先创建了不同区域的二进制掩码,然后使用掩码计算强度。然而,问题是当我对强度求和时,我得到了负值。如果做np.int64,问题就不会发生,但是如果我做int 16/32,值会改变。那么哪一个是正确的,我把它放在正确的地方了吗?如果我用astype(“uint 64”)做np.int64,有什么区别吗?

image = imread(path)
nucleus = gaussian_filter(image,5)
nucleus_mask = np.where(nucleus>10000,1,0)

tissue = gaussian_filter(image,5)
tissue_mask = np.where(tissue> 1000,1,0)

only_tissue = tissue_mask - nucleus_mask
only_tissue = np.where(only_tissue<0,0,only_tissue) 

autoAb = imread(auto_path)
auto_nucleus = np.sum(np.int64(nucleus_mask*autoAb))
auto_cyto = np.sum(np.int64(only_tissue*autoAb))
8yparm6h

8yparm6h1#

许多小值的总和将是一个大值。
该大值可能太大而无法装入16位或32位整数(有符号或无符号)。
如果你有65538个像素(大约是256 × 256像素),每个像素都包含值65535,所有这些像素的总和(或乘积)是0x10000fffe,这不适合32位。
如果只取最大值的一半像素(32769,大约181 × 181像素),仍然会溢出一个有符号的32位整数,结果将是负数。
您可以使用np.sum()dtype参数。总和将从原始元素计算,但它将是正确的。
Numpy基本上不关心你使用的是np.uint64还是"uint64"还是"u8"

相关问题