数组比较不匹配numpy中的元素比较

use*_*665 7 python arrays floating-point numpy floating-accuracy

我有一个numpy数组arr.这是一个numpy.ndarray,大小是(5553110,),dtype=float32.

当我做:

(arr > np.pi )[3154950]
False
(arr[3154950] > np.pi )
True
Run Code Online (Sandbox Code Playgroud)

为什么第一次比较错了?我该如何解决?

价值:

arr[3154950]= 3.1415927
np.pi= 3.141592653589793
Run Code Online (Sandbox Code Playgroud)

问题是精确的吗?

jpp*_*jpp 6

问题是由于np.float32vs的准确性np.float64.

使用np.float64,你不会看到问题:

import numpy as np

arr = np.array([3.1415927], dtype=np.float64)

print((arr > np.pi)[0])  # True

print(arr[0] > np.pi)    # True
Run Code Online (Sandbox Code Playgroud)

正如@WarrenWeckesser评论:

它涉及numpy如何决定投射其操作的参数.显然,使用时arr > scalar,标量将转换为与数组相同的类型arr,在本例中为np.float32.另一方面,使用arr > arr2两个参数非标量数组,它们将使用通用数据类型.这就是原因(arr > np.array([np.pi]))[3154950]返回True.

相关的github问题

  • 它涉及numpy如何决定投射其操作的参数.显然,使用`arr>标量`,标量将转换为与数组`arr`相同的类型,在本例中为`np.float32`.另一方面,对于像'arr> arr2`这样的两个参数非标量数组,它们将使用通用数据类型.这就是为什么`(arr> np.array([np.pi]))[3154950]`返回True. (2认同)