使用包含NaN的十进制值时,Numpy max函数失败

时间:2014-08-27 15:26:00

标签: python numpy

使用浮点值时,一切都很顺利。

>>> import numpy as np
>>> np.max(1.2, np.nan)
>>> nan

但是,使用Decimal值时...

>>> import numpy as np
>>> import decimal as d 
>>> np.max([d.Decimal('1.2'), d.Decimal('NaN')])
>>> InvalidOperation: comparison involving NaN

有没有办法让NaN' s得到很好的十进制值?

注意:

  • Python 2.7
  • Numpy 1.6.2

2 个答案:

答案 0 :(得分:4)

哼......如果至少有一个 NaN ,结果是 NaN

包装功能:

def my_max(arr):
    try:
        return np.max(arr)
    except d.InvalidOperation:
        return d.Decimal('NaN')

不是很性感,但是......

<小时/> 另一种方法......也许......作为Decimal allows to "un-trap" some exceptions,返回一个值而不是抛出异常:

# change globally
>>> d.getcontext().traps[d.InvalidOperation] = 0
>>> np.max([d.Decimal('1.2'), d.Decimal('NaN')])
Decimal('NaN')


# use a context manager to change locally:
with d.localcontext() as ctx:
    ctx.traps[d.InvalidOperation] = 0
    np.max([d.Decimal('1.2'), d.Decimal('NaN')])

答案 1 :(得分:1)

您可以将列表转换为数据类型float的NumPy数组。然后所有NumPy函数都应该运行良好:

import numpy as np
import decimal as d

print np.max(np.array([0, 1, d.Decimal('nan')], dtype='float'))
print np.nanmax(np.array([0, 1, d.Decimal('nan')], dtype='float'))

输出:

nan
1.0