numpy.isfinite()中发生意外的异常 [英] Unexpected Exception in numpy.isfinite()

查看:87
本文介绍了numpy.isfinite()中发生意外的异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于某种我不明白的原因,我得到了这个例外.这很复杂,我的np.array v来自何处,但是这是发生异常时的代码:

I get this exception for a reason I do not understand. It is quite complicated, where my np.array v comes from, but here is the code when the exception occurs:

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,应该没问题.也许是个错误?有时只会发生此错误,但找不到数组之间的差异.始终具有相同的类型.

I do not understand the TypeError. All the elements are np.float64 and should be fine. Maybe a bug? This Error does only occure sometimes, but I can't find differences between the arrays. The always have the same type.

先谢谢了.

工作示例:

数据结构如上所述.

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!"

这是在这里运行,使用:

This is run here using:

MacOsX Mavericks,Python 2.7.6,numpy 1.8.1,pandas 0.13.1

MacOsX Mavericks, Python 2.7.6, numpy 1.8.1, pandas 0.13.1

推荐答案

H_estim.values是一个数据类型为object的numpy数组(请查看H_estim.values.dtype):

H_estim.values is a numpy array with the data type object (take a look at 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 an object array, the data stored in the array's memory are pointers to python objects, not the objects themselves. In this case, the objects are np.float64 instances:

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)不处理对象数组.

So in many respects, this array looks and acts like an array of np.float64 values, but it is not the same. In particular, the numpy ufuncs (including np.isfinite) don't handle object arrays.

H_estim.values.astype(np.float64)将数组转换为数据类型为np.float64的数组(即一个数组,其中数组元素是实际的浮点值,而不是指向对象的指针).将以下内容与上面显示的H_estim.values的输出进行比较.

H_estim.values.astype(np.float64) converts the array to one with data type np.float64 (i.e. an array where the array elements are the actual floating point values, not pointers to objects). Compare the following to the output shown above for 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')

这篇关于numpy.isfinite()中发生意外的异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆