Python 将numpy.unique与蒙版数组一起使用会遇到一些奇怪的问题

Python 将numpy.unique与蒙版数组一起使用会遇到一些奇怪的问题,python,numpy,Python,Numpy,我正在使用numpy计算uint8数据类型ndarray中每个元素的数量,但遇到了一些奇怪的问题,如: a = np.random.randint(0, 256, (10980, 10980)).astype(np.uint8) s_values, s_idx, s_counts = np.unique(a, return_inverse=True, return_counts=True) print(lenth(s_values) # 256 print(s_counts) [470996

我正在使用numpy计算uint8数据类型ndarray中每个元素的数量,但遇到了一些奇怪的问题,如:

a = np.random.randint(0, 256, (10980, 10980)).astype(np.uint8)
s_values, s_idx, s_counts = np.unique(a, return_inverse=True, return_counts=True)
print(lenth(s_values)  # 256
print(s_counts)

[470996 472336 472608 469978 471579 470698 470149 471167 470199 471153
471447 471972 470542 471369 470223 472189 470976 470971 471516 472120
470907 470808 470535 471825 470549 470794 471589 471267 470354 471701
472085 471199 469698 471675 470855 471282 470304 470156 471347 469881
470653 470901 470820 470253 470350 471043 470839 470262 470185 471895
470491 470297 471471 472009 471284 470593 470489 470297 470743 470461
472091 470997 472254 470388 470334 471444 470368 470054 468965 471678
470659 471519 470368 471808 470282 470356 471117 470904 470146 471554
470983 470734 471132 472531 471347 471159 471958 470035 470082 470979
471059 471713 472054 472314 470982 470142 471811 469707 471153 470774
470882 469754 470347 471465 471326 470490 470157 470703 470851 471749
470820 471016 472073 471125 470411 471177 470608 472016 470410 470624
470940 471711 471198 471620 470899 470480 471047 471037 470763 469869
471405 471485 470928 470446 470314 469986 471456 470344 469462 471189
471236 470927 470971 470620 471029 470045 470194 471149 472302 470903
470800 471068 471584 469641 471862 471931 471446 471432 469624 471306
470597 470624 471715 470632 470675 469995 472048 472247 470595 470474
470176 470209 469369 470637 471426 471391 470602 471379 469996 471050
470192 470801 470168 470905 471115 471436 471910 471125 469920 470043
470541 470743 471300 471162 471920 472646 471269 471604 469770 470841
470523 471890 470018 470805 470178 471287 470340 470491 470361 470354
470911 469871 470247 471402 470242 470931 471327 471024 472331 470700
471708 470661 470969 471026 471450 471053 470415 470623 470546 470612
470266 470994 471355 470044 470713 471846 471249 471964 470706 469506
470391 471127 471511 472138 471170 471721 471438 471965 471573 471211
471939 470819 469529 470699 470280 471779]
当数组没有被屏蔽时,s_值和s计数的长度是正确的,我们可以看到元素0的数量是470996。但是如果我屏蔽了0元素,事情就变了

# mask 0 value
y = np.ma.masked_equal(a, 0)

s_values2, s_idx2, s_counts2 = np.unique(y, return_inverse=True, return_counts=True)

print(len(s_values2))  # 471534
现在通常s_值2应该只有256个值,但在我的例子中,它显示471534个值。如果np.ma.masked_equal正确工作,这个过程应该只将元素0转换为不在(0256)范围内的值,因此它将被重新定义为一个屏蔽值,但是s_值的长度仍然应该是256,即从1到255加上一个屏蔽值,该值为0,但是事情并没有按照我的预期进行。我不知道为什么会这样


注意,此问题仅在数据类型为uint8时发生,如果数据类型为float64,则无论我们是否屏蔽此数组,都不会发生。此外,如果数组没有那么大,如1000*1000 uin8 ndarray,它也会正常工作。

难道没有人能回答我的问题吗?我真的很困惑,你可以检查面具后面的值-这两个值是什么?最好在屏蔽数组上使用
np.ma…
函数。其他numpy函数可能无法正确处理掩码。他们可能会忽略面具。唯一取决于排序。第一个
s值
显示的是数组的浮点版本(值为浮点)。当我自己测试
unique
arange
array
np。unique
的行为与预期一致。但是
uint8
数组的fill_值是
0
。我不知道
unique
是如何处理屏蔽数组的,但这可能是个问题。您可以尝试其他数据类型。如果你能给我们一个小例子,重现这个问题,很好。我不会用你的大阵列测试东西!我很想调整数据的大小,但是np.unique在调整大小的数据上工作得很好,似乎这个问题只能用原始数据重现。@hpaulj,我也很想提供关于我的数据的更多信息,请参见新的编辑。难道没有人能回答我的问题吗?我真的很困惑,你可以检查面具后面的值-这两个值是什么?最好在屏蔽数组上使用
np.ma…
函数。其他numpy函数可能无法正确处理掩码。他们可能会忽略面具。唯一取决于排序。第一个
s值
显示的是数组的浮点版本(值为浮点)。当我自己测试
unique
arange
array
np。unique
的行为与预期一致。但是
uint8
数组的fill_值是
0
。我不知道
unique
是如何处理屏蔽数组的,但这可能是个问题。您可以尝试其他数据类型。如果你能给我们一个小例子,重现这个问题,很好。我不会用你的大阵列测试东西!我很想调整数据的大小,但是np.unique在调整大小的数据上工作得很好,似乎这个问题只能用原始数据重现。@hpaulj,我也很想提供有关我的数据的更多信息,请参阅新的编辑。