Почему «numpy.mean» возвращает ‘inf’?

#python #numpy

#python #numpy

Вопрос:

Мне нужно вычислить среднее значение в столбцах массива с более чем 1000 строками.

np.mean(some_array) выдает мне inf в качестве вывода

но я почти уверен, что значения в порядке. Я загружаю csv отсюда в свою Data переменную, и столбец «цемент», с моей точки зрения, «здоров».

 In[254]:np.mean(Data[:230]['Cement'])
Out[254]:275.75
  

но если я увеличу количество строк
, проблема начнется:

 In [259]:np.mean(Data[:237]['Cement'])
Out[259]:inf
  

но когда я смотрю на данные

 In [261]:Data[230:237]['Cement']
Out[261]:
 array([[ 425. ],
        [ 333.  ],
        [ 250.25],
        [ 491.  ],
        [ 160.  ],
        [ 229.75],
        [ 338.  ]], dtype=float16)
  

я не нахожу причины такого поведения
P.S Это происходит в Python 3.x с использованием wakari (облачный Ipython)

Версия Numpy ‘1.8.1’

Я загружаю данные с помощью:

 No_Col=9
conv = lambda valstr: float(valstr.replace(',','.'))

c={}
for i in range(0,No_Col,1):
    c[i] = conv

Data=np.genfromtxt(get_data,dtype=float16 , delimiter='t', skip_header=0, names=True,   converters=c)
  

Комментарии:

1. Я не могу воспроизвести ошибку с этими данными. Кроме того, данные, которые я вижу в этих номерах строк в CSV, не совпадают с тем, что вы показываете. Как вы его загружаете?

2. Угадайте: он переполняет значение с плавающей точкой? Я вижу, что вы используете 16-битное значение с плавающей запятой, которое имеет максимальное значение 65504 .

3. я отредактировал вопрос, чтобы быть более точным.

4. Да, это похоже на причину. @Hiatus, почему ты используешь float16?

5. В сторону: стандартная рекомендация — если вы работаете с данными, в которых вы хотите назвать столбцы, вам, вероятно, лучше, pandas чем просто numpy.

Ответ №1:

Я предполагаю, что проблема заключается в точности (как и другие также прокомментировали). Цитируя непосредственно из документации mean() , мы видим

Примечания

Среднее арифметическое — это сумма элементов вдоль оси, деленная на количество элементов.

Обратите внимание, что для ввода с плавающей запятой среднее значение вычисляется с той же точностью, что и для ввода. В зависимости от входных данных это может привести к неточным результатам, особенно для float32 (см. Пример ниже). Указание аккумулятора более высокой точности с использованием dtype ключевого слова может решить эту проблему.

Поскольку ваш массив имеет тип float16, у вас очень ограниченная точность. Использование dtype=np.float64 , вероятно, уменьшит переполнение. Также смотрите Примеры в mean() документации.