Неожиданное исключение в numpy.isfinite()
Я получаю это исключение по той причине, которую я не понимаю. Это довольно сложно, откуда приходит мой np.array v, но вот код, когда возникает исключение:
print v, type(v)
for val in v:
print val, type(val)
print "use isfinte() with astype(float64): "
np.isfinite(v.astype("float64"))
print "use isfinite() as usual: "
try:
np.isfinite(v)
except Exception,e:
print e
Это дает следующий результат:
[6.4441947744288255 7.2246449651781788 4.1028442021807656
4.8832943929301189] <type 'numpy.ndarray'>
6.44419477443 <type 'numpy.float64'>
7.22464496518 <type 'numpy.float64'>
4.10284420218 <type 'numpy.float64'>
4.88329439293 <type 'numpy.float64'>
np.isfinte() with astype(float64):
[ True True True True]
np.isfinte() as usual:
ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
Я не понимаю TypeError. Все элементы - np.float64, и все должно быть хорошо. Может быть, ошибка? Эта ошибка возникает только иногда, но я не могу найти различия между массивами. Всегда имеют один и тот же тип.
Спасибо заранее.
EDIT: Рабочий пример:
Структуры данных такие же маленькие, как показано выше.
import pandas as pd
import numpy as np
def forward_estim(H,end):
old_idx = H.index
new_idx = pd.period_range(old_idx[-1],end,freq=old_idx.freq)
H_estim = pd.DataFrame(columns=["A","B","C","D"],index=new_idx)
H_chg = H.values[1:]-H.values[:-1]
mean_ = H_chg.mean()
std_ = H_chg.std()
H_estim.ix[0] = H.ix[-1]
for i in range(1,len(H_estim)):
H_estim.A[i] = H_estim.A[i-1] + mean_ + std_/2
H_estim.B[i] = H_estim.B[i-1] + mean_ + std_
H_estim.C[i] = H_estim.C[i-1] + mean_ - std_
H_estim.D[i] = H_estim.D[i-1] + mean_ - std_/2
return H_estim.ix[1:]
H_idx = pd.period_range("2010-01-01","2012-01-01",freq="A")
print H_idx
H = pd.Series(np.array([2.3,3.0,2.9]),index=H_idx)
print H
H_estim = forward_estim(H,"2014-01-01")
print H_estim
np.isfinite(H_estim.values.astype("float64"))
print "This works!"
np.isfinite(H_estim.values)
print "This does not work!"
Это выполняется здесь, используя:
MacOsX Mavericks, Python 2.7.6, numpy 1.8.1, pandas 0.13.1
Ответы
Ответ 1
H_estim.values
представляет собой массив numpy с типом данных object
(посмотрите H_estim.values.dtype
):
In [62]: H_estim.values
Out[62]:
array([[3.4000000000000004, 3.6000000000000005, 2.7999999999999998, 3.0],
[3.9000000000000004, 4.3000000000000007, 2.6999999999999993,
3.0999999999999996]], dtype=object)
In [63]: H_estim.values.dtype
Out[63]: dtype('O')
В массиве object
данные, хранящиеся в памяти массива, являются указателями на объекты python, а не сами объекты. В этом случае объекты np.float64
экземпляры:
In [65]: H_estim.values[0,0]
Out[65]: 3.4000000000000004
In [66]: type(H_estim.values[0,0])
Out[66]: numpy.float64
Итак, во многих отношениях этот массив выглядит и действует как массив значений np.float64
, но это не то же самое. В частности, numpy ufuncs (включая np.isfinite
) не обрабатывают массивы объектов.
H_estim.values.astype(np.float64)
преобразует массив в один с типом данных np.float64
(т.е. массив, в котором элементы массива являются фактическими значениями с плавающей запятой, а не указателями на объекты). Сравните приведенное выше значение для H_estim.values
.
In [70]: a = H_estim.values.astype(np.float64)
In [71]: a
Out[71]:
array([[ 3.4, 3.6, 2.8, 3. ],
[ 3.9, 4.3, 2.7, 3.1]])
In [72]: a.dtype
Out[72]: dtype('float64')
Ответ 2
Вы предполагаете, что "все элементы np.float64 и должны быть в порядке". Однако это, вероятно, не так. Насколько велика структура данных? Можете ли вы посмотреть на все ценности и найти что-то подозрительное? Из http://matplotlib.1069221.n5.nabble.com/type-error-with-python-3-2-and-version-1-1-1-of-matplotlib-numpy-error-td38784.html мы видим, что эта проблема может возникать при использовании типов данных Decimal
. Есть ли способ создать минимальный рабочий пример, который воспроизводит проблему? Это должно быть возможно, и когда вы создадите этот пример, это, скорее всего, уже выявит проблему.