使用浮点值时,一切都很顺利。
>>> 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得到很好的十进制值?
注意:
答案 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