Сравнение массива не соответствует поэлементному сравнению в numpy - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть массив 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 Ответ

0 голосов
/ 26 апреля 2018

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

...