其他

IEEE 754浮点特殊值

numpy中定义的特殊值:nan,inf,

奶奶可以当穷人的面具(如果你不在乎最初的价值是什么的话)

注意:不能使用相等来测试nan。例如::

>>> myarr = np.array([1., 0., np.nan, 3.])
>>> np.nonzero(myarr == np.nan)
(array([], dtype=int64),)
>>> np.nan == np.nan  # is always False! Use special numpy functions instead.
False
>>> myarr[myarr == np.nan] = 0. # doesn't work
>>> myarr
array([  1.,   0.,  NaN,   3.])
>>> myarr[np.isnan(myarr)] = 0. # use this instead find
>>> myarr
array([ 1.,  0.,  0.,  3.])

其他相关特殊值函数::

isinf():    True if value is inf
isfinite(): True if not nan or inf
nan_to_num(): Map nan to 0, inf to max float, -inf to min float

以下与常规函数相对应,但结果中不包括nan::

nansum()
nanmax()
nanmin()
nanargmax()
nanargmin()

>>> x = np.arange(10.)
>>> x[3] = np.nan
>>> x.sum()
nan
>>> np.nansum(x)
42.0

numpy如何处理数字异常

默认为 'warn' 对于 invaliddivideoverflow'ignore' 对于 underflow . 但这可以更改,并且可以针对不同类型的异常单独设置。不同的行为是:

  • “忽略”:发生异常时不采取任何操作。

  • “警告”:打印 RuntimeWarning (通过Python) warnings 模块)。

  • “升高”:升高 FloatingPointError .

  • “call”:调用使用 seterrcall 功能。

  • “print”:将警告直接打印到 stdout .

  • “日志”:在由指定的日志对象中记录错误 seterrcall .

这些行为可以针对各种错误或特定错误进行设置:

  • 全部:应用于所有数值异常

  • 无效:生成NAN时

  • 除以:除以零(对于整数也是如此!)

  • 溢出:浮点溢出

  • 下溢:浮点下溢

请注意,整数除以零是由同一个机器处理的。这些行为是在每个线程的基础上设置的。

实例

>>> oldsettings = np.seterr(all='warn')
>>> np.zeros(5,dtype=np.float32)/0.
invalid value encountered in divide
>>> j = np.seterr(under='ignore')
>>> np.array([1.e-100])**10
>>> j = np.seterr(invalid='raise')
>>> np.sqrt(np.array([-1.]))
FloatingPointError: invalid value encountered in sqrt
>>> def errorhandler(errstr, errflag):
...      print("saw stupid error!")
>>> np.seterrcall(errorhandler)
<function err_handler at 0x...>
>>> j = np.seterr(all='call')
>>> np.zeros(5, dtype=np.int32)/0
FloatingPointError: invalid value encountered in divide
saw stupid error!
>>> j = np.seterr(**oldsettings) # restore previous
...                              # error-handling settings

与C接口

只有对选择的调查。每一个工作原理的小细节。

  1. 裸金属,手工包装自己的C代码。

  • Plusses:

    • 有效的

    • 不依赖其他工具

  • 缺点:

    • 大量的学习开销:

      • 需要学习Python C API的基础知识

      • 需要学习numpy c api的基础知识

      • 需要学习如何处理参考计数并喜欢它。

    • 参考计数通常很难得到正确的结果。

      • 出错会导致内存泄漏,更糟的是,会导致SegFaults

    • API将更改为python 3.0!

  1. 赛隆

  • Plusses:

    • 避免学习C API

    • 不处理参考计数

    • 可以用伪python编码并生成C代码

    • 也可以与现有的C代码接口

    • 应该保护您免受对python c api的更改

    • 已经成为科学 Python 社区中的事实标准

    • 对数组的快速索引支持

  • 缺点:

    • 可以以非标准形式编写可能会过时的代码

    • 不像手工包装那样灵活

  1. C型

  • Plusses:

    • python标准库的一部分

    • 适用于与现有可共享库(尤其是Windows DLL)的接口

    • 避免API/引用计数问题

    • 良好的numpy支持:数组的ctypes属性中包含所有这些属性:::

      a.ctypes.data              a.ctypes.get_strides
      a.ctypes.data_as           a.ctypes.shape
      a.ctypes.get_as_parameter  a.ctypes.shape_as
      a.ctypes.get_data          a.ctypes.strides
      a.ctypes.get_shape         a.ctypes.strides_as
      
  • 缺点:

    • 不能用于编写要转换为C扩展的代码,只能使用包装工具。

  1. 自动包装机

  • Plusses:

    • 大约很长时间

    • 多脚本语言支持

    • C++支持

    • 适合包装大型(多个函数)现有C库

  • 缺点:

    • 在python和c代码之间生成大量代码

    • 可能导致性能问题,几乎不可能优化

    • 接口文件可能难以写入

    • 不一定避免引用计数问题或需要了解API

  1. scipy.weave

  • Plusses:

    • 可以将许多numpy表达式转换为C代码

    • 动态编译和加载生成的C代码

    • 可以在python模块中嵌入纯C代码,并有weave提取、生成接口和编译等功能。

  • 缺点:

    • 未来非常不确定:它是scipy中唯一一个没有移植到python 3的部分,实际上已经被弃用,取而代之的是cython。

  1. 心理医生

  • Plusses:

    • 通过类似于JIT的优化,将纯Python转换为高效的机器代码

    • 优化得很好,速度很快

  • 缺点:

    • 仅在Intel(Windows?)

    • 对 NumPy 没什么作用?

与Fortran接口:

包装Fortran代码的明确选择是 f2py .

Pyfort是一个较旧的替代方案,但不再受支持。fwrap是一个新的项目,看起来很有希望,但现在还没有开发出来。

C++接口

  1. 赛隆

  2. CXX

  3. Boost.python

  4. SWIG

  5. SIP(主要用于PYQT)