Python 当使用包含NaN的十进制值时,Numpy max函数失败
使用浮点值时一切正常Python 当使用包含NaN的十进制值时,Numpy max函数失败,python,numpy,Python,Numpy,使用浮点值时一切正常 >>> import numpy as np >>> np.max(1.2, np.nan) >>> nan 但是,当使用十进制值时 >>> import numpy as np >>> import decimal as d >>> np.max([d.Decimal('1.2'), d.Decimal('NaN')]) >>> Invalid
>>> import numpy as np
>>> np.max(1.2, np.nan)
>>> nan
但是,当使用十进制值时
>>> import numpy as np
>>> import decimal as d
>>> np.max([d.Decimal('1.2'), d.Decimal('NaN')])
>>> InvalidOperation: comparison involving NaN
有没有一种方法可以通过NaN获得十进制值,从而更好地发挥作用
注:
- Python 2.7
- Numpy 1.6.2
- 哼。。。如果至少有一个NaN,则结果为NaN
在函数中换行:
def my_max(arr):
try:
return np.max(arr)
except d.InvalidOperation:
return d.Decimal('NaN')
虽然不是很性感
另一种选择。。。大概作为,返回值而不是引发异常:
# change globally
>>> d.getcontext().traps[d.InvalidOperation] = 0
>>> np.max([d.Decimal('1.2'), d.Decimal('NaN')])
Decimal('NaN')
您可以将列表转换为数据类型为
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
也不是很健壮-如果你因为不同的原因得到一个无效操作会发生什么?@markransem我想不出任何东西,除了一个NaN,它可能会使
np.max
抛出一个无效操作
。你有什么具体的想法吗?我对Numpy不太熟悉,所以我不确定,但是一个None
示例不会抛出错误吗?这是一个很容易意外得到的例子。@markransem事实上,None
是“透明的”:np.max([d.Decimal(1.2),None])==d.Decimal(1.2)
。其他“奇怪”值(字典、对象等)会产生意外结果,但不会引发invalidooperation
异常。@MarkRansom抱歉,我没有说得很清楚:invalidooperation
属于Decimal
而不是numpy
。这实际上是将Decimal('NaN')
与触发该异常的其他内容进行比较。这可能是一个输入错误,但您应该编写d.Decimal('1.2')
,以利用十进制表示法d.Decimal(1.2)=Decimal('1.199999999999999555910790149937383830547332763671875')
@SylvainLeroux谢谢,我已经将它改为d.Decimal('1.2')
。效果很好,但是结果/输出的类型是numpy.float64
。我想可以将结果转换回十进制。这是否效率低下?@AtlasStrategic:Hm,效率可能取决于您的应用程序。对我来说,来回转换巨大的数组听起来效率很低,但对于一些值来说可能还可以。你真的需要十进制数吗?你不能完全改用NumPy吗?@AtlasStrategic在我看来,这不是效率问题。从Decimal
转换为float和back,会使您失去使用十进制表示法的所有好处。因此,整个过程取决于您对十进制数的需求<代码>十进制(浮点(十进制('1.2'))==十进制('1.1999999999999555910790149937383830547332763671875')
@SylvainLeroux:我同意。(我刚刚注意到问题略微改为d.Decimal('1.2')
,从而利用了Decimal
的优点)
nan
1.0