#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()
документации.