为什么 np.where & np.min 似乎不能正确处理这个数组?
Why don't np.where & np.min seem to work right with this array?
问题
所以我导入了一个数组,其中包含从 ~0.0 到 ~0.76 的值 运行。当我开始尝试使用 Numpy 查找最小值和最大值时,我 运行 遇到了一些 st运行ge 不一致,我想知道如果它们是我的错如何解决,或者如果它们是我的错则避免这是 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]
看看 returns.
(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()
混在returns两个位置,其中一个肯定不是最小值?
你有两个问题:float
的解释和np.where
的结果的解释。
- 非整数浮点数在内部以二进制存储,并不总是能准确地用十进制表示。同样,十进制数并不总是可以用二进制精确表示。这就是为什么
np.where(array == 0.763728955743)
return 是一个空数组,而 print np.where(array == np.max(array))
做正确的事情。请注意,第二种情况只是在内部使用了精确的二进制数,没有进行任何转换。搜索最小值会成功,因为 0.0
可以 精确地用十进制和二进制表示。一般来说,出于这个原因和相关原因,使用 ==
比较 float
是个坏主意。
对于您正在使用的np.where
版本,它退化为np.nonzero
。您在这里解释结果是因为它 return 是数组的每个维度的数组,而不是单个坐标数组。有多种不同的说法:
- 如果你有三个匹配项,你将得到两个数组,每个数组包含三个元素。
- 如果您有一个包含两个匹配项的 3D 输入数组,您将返回三个数组,每个数组包含两个元素。
- 第一个数组是行坐标 (dim 0),第二个数组是列坐标 (dim 1)。
- 请注意您是如何解释
where
的最大情况的输出的。这是正确的,但这不是你在最小情况下所做的。
有多种方法可以处理这些问题。最简单的可能是使用 np.argmax
and np.argmin
。这些将分别return数组中最大值或最小值的第一个坐标。
>>> x = np.argmax(array)
>>> print(x)
array([35, 57])
>> print(array[x])
0.763728955743
这里唯一可能的问题是您可能想要获取所有坐标。
在这种情况下,使用where
或nonzero
即可。与您的代码的唯一区别是您应该打印
print array[10,31], array[25,131]
而不是你正在做的转置值。
尝试使用 numpy.isclose()
而不是 ==
。因为无法测试浮点数是否完全相等。
即改变这个:np.where(array == 0.763728955743)
至:np.isclose(array, 0.763728955743)
np.min()
和 np.max()
按我的预期工作。另请注意,如果需要,您可以提供类似 arr.min(axis=1)
的轴。
如果这不能解决问题,也许您可以 post 在某处获取一些 csv 数据来尝试重现该问题?我有点怀疑这是 numpy 本身的错误,但你永远不知道!
问题
所以我导入了一个数组,其中包含从 ~0.0 到 ~0.76 的值 运行。当我开始尝试使用 Numpy 查找最小值和最大值时,我 运行 遇到了一些 st运行ge 不一致,我想知道如果它们是我的错如何解决,或者如果它们是我的错则避免这是 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]
看看 returns.
(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()
混在returns两个位置,其中一个肯定不是最小值?
你有两个问题:float
的解释和np.where
的结果的解释。
- 非整数浮点数在内部以二进制存储,并不总是能准确地用十进制表示。同样,十进制数并不总是可以用二进制精确表示。这就是为什么
np.where(array == 0.763728955743)
return 是一个空数组,而print np.where(array == np.max(array))
做正确的事情。请注意,第二种情况只是在内部使用了精确的二进制数,没有进行任何转换。搜索最小值会成功,因为0.0
可以 精确地用十进制和二进制表示。一般来说,出于这个原因和相关原因,使用==
比较float
是个坏主意。 对于您正在使用的
np.where
版本,它退化为np.nonzero
。您在这里解释结果是因为它 return 是数组的每个维度的数组,而不是单个坐标数组。有多种不同的说法:- 如果你有三个匹配项,你将得到两个数组,每个数组包含三个元素。
- 如果您有一个包含两个匹配项的 3D 输入数组,您将返回三个数组,每个数组包含两个元素。
- 第一个数组是行坐标 (dim 0),第二个数组是列坐标 (dim 1)。
- 请注意您是如何解释
where
的最大情况的输出的。这是正确的,但这不是你在最小情况下所做的。
有多种方法可以处理这些问题。最简单的可能是使用 np.argmax
and np.argmin
。这些将分别return数组中最大值或最小值的第一个坐标。
>>> x = np.argmax(array)
>>> print(x)
array([35, 57])
>> print(array[x])
0.763728955743
这里唯一可能的问题是您可能想要获取所有坐标。
在这种情况下,使用where
或nonzero
即可。与您的代码的唯一区别是您应该打印
print array[10,31], array[25,131]
而不是你正在做的转置值。
尝试使用 numpy.isclose()
而不是 ==
。因为无法测试浮点数是否完全相等。
即改变这个:np.where(array == 0.763728955743)
至:np.isclose(array, 0.763728955743)
np.min()
和 np.max()
按我的预期工作。另请注意,如果需要,您可以提供类似 arr.min(axis=1)
的轴。
如果这不能解决问题,也许您可以 post 在某处获取一些 csv 数据来尝试重现该问题?我有点怀疑这是 numpy 本身的错误,但你永远不知道!