Skip to main content
 首页 » 编程设计

python之为什么 np.where & np.min 似乎不能正确处理这个数组

2025年05月04日24tintown

问题

所以我导入了一个数组,其中包含从 ~0.0 到 ~0.76 的值。当我开始尝试使用 Numpy 查找最小值和最大值时,我遇到了一些奇怪的不一致问题,如果它们是我的错,我想知道如何解决,或者如果它们是 Numpy 开发人员端的编程错误,我想知道如何解决。

代码

让我们从使用 np.max 和 np.where 找到最大值的位置开始。

print array.shape 
print np.max(array) 
print np.where(array == 0.763728955743) 
print np.where(array == np.max(array)) 
print array[35,57] 

输出是这样的:

(74, 145) 
0.763728955743 
(array([], dtype=int64), array([], dtype=int64)) 
(array([35]), array([57])) 
0.763728955743 

当我寻找数组恰好等于最大条目值的位置时,Numpy 没有找到它。但是,当我只是搜索最大值的位置而不指定该值是什么时,它就起作用了。请注意,这不会发生在 np.min 中。

现在我有一个关于最小值的不同问题。

print array.shape 
print np.min(array) 
print np.where(array == 0.0) 
print np.where(array == np.min(array)) 
print array[10,25], array[31,131] 

查看返回。

(74, 145) 
0.0 
(array([10, 25]), array([ 31, 131])) 
(array([10, 25]), array([ 31, 131])) 
0.0769331747301 1.54220192172e-09 

1.54^-9 非常接近 0.0,似乎是最小值。但为什么 np.where 也列出了值为 0.077 的位置?与其他值相比,这甚至不接近 0.0。

问题

为什么 np.where 在输入数组的最大值时似乎不起作用,但在搜索 np.max(array) 时却起作用?为什么 np.where() 与 np.min() 混合返回两个位置,其中一个肯定不是最小值?

请您参考如下方法:

您有两个问题:float 的解释和 np.where 结果的解释.

  1. 非整数 float 在内部以二进制形式存储,并不总是可以精确地用十进制表示法表示。同样,十进制数并不总是可以用二进制精确表示。这就是为什么 np.where(array == 0.763728955743) 返回一个空数组,而 print np.where(array == np.max(array)) 是正确的事物。请注意,第二种情况只是在内部使用了精确的二进制数,没有进行任何转换。对最小值的搜索成功了,因为 0.0 可以用十进制和二进制精确表示。一般来说,出于这个原因和相关原因,使用 == 比较 float 不是一个好主意。
  2. 对于您正在使用的np.where 版本,它会变成np.nonzero .您在这里解释结果是因为它为数组的每个维度返回一个数组,而不是单个坐标数组。有多种不同的说法:

    • 如果您有三个匹配项,您将得到两个数组,每个数组包含三个元素。
    • 如果您有一个包含两个匹配项的 3D 输入数组,您将得到三个数组,每个数组包含两个元素。
    • 第一个数组是行坐标 (dim 0),第二个数组是列坐标 (dim 1)。
    • 注意您是如何解释 where 的最大情况的输出的。这是正确的,但这不是您在最小情况下所做的。

有多种方法可以处理这些问题。最简单的可能是使用 np.argmax和 np.argmin .这些将分别返回数组中最大值或最小值的第一个坐标。

>>> x = np.argmax(array) 
>>> print(x) 
array([35, 57]) 
>> print(array[x]) 
0.763728955743 

这里唯一可能的问题是您可能想要获取所有坐标。

在这种情况下,使用 where 或 nonzero 就可以了。与您的代码的唯一区别是您应该打印

print array[10,31], array[25,131] 

而不是你正在做的转置值。