由于我不明白的原因,我得到了这个例外.这是非常复杂的,我的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
Run Code Online (Sandbox Code Playgroud)
这给出了以下输出:
[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''
Run Code Online (Sandbox Code Playgroud)
我不明白TypeError.所有元素都是np.float64,应该没问题.也许是个bug?此错误有时只会发生,但我找不到数组之间的差异.总是有相同的类型.
提前致谢.
编辑:工作示例:
数据结构与上面显示的一样小.
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!"
Run Code Online (Sandbox Code Playgroud)
这是在这里使用:
MacOsX Mavericks,Python 2.7.6,numpy 1.8.1,pandas 0.13.1
War*_*ser 13
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')
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
因此,在许多方面,这个数组看起来像一个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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15158 次 |
| 最近记录: |