Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当使用包含NaN的十进制值时,Numpy max函数失败_Python_Numpy - Fatal编程技术网

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