Сравнение массивов, не соответствующих элементному сравнению в 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 7

1 ответ:

Проблема связана с точностью np.float32 vs 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

Как @ WarrenWeckesser комментирует:

Она включает в себя то, как numpy решает привести аргументы своих операций. По-видимому, с arr > scalar скаляр преобразуется в то же самое введите в качестве массива arr, который в данном случае является np.float32. С другой силы, что-то вроде arr > arr2, с обоих аргументов нескалярные массивы, они будут использовать общие данные тип. Вот почему (arr > np.array([np.pi]))[3154950] возвращает True.

Связанный выпуск github