Сравнение массивов, не соответствующих элементному сравнению в numpy
У меня есть массив numpy arr
. Это numpy.ndarray
, размер такой (5553110,)
, dtype=float32
.
Когда я это делаю:
(arr > np.pi )[3154950]
False
(arr[3154950] > np.pi )
True
Почему первое сравнение неверно? И как я могу это исправить?
Значения:
arr[3154950]= 3.1415927
np.pi= 3.141592653589793
Есть ли проблема с точностью?
1 ответ:
Проблема связана с точностью
np.float32
vsnp.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
Как @ WarrenWeckesser комментирует:
Она включает в себя то, как numpy решает привести аргументы своих операций. По-видимому, сarr > scalar
скаляр преобразуется в то же самое введите в качестве массиваarr
, который в данном случае являетсяnp.float32
. С другой силы, что-то вродеarr > arr2
, с обоих аргументов нескалярные массивы, они будут использовать общие данные тип. Вот почему (arr > np.array([np.pi]))[3154950]
возвращаетTrue
.