Miscellaneous

IEEE 754 Floating Point Special Values

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

NaNs可以用作穷人的面具(如果你不在乎原来的价值是什么)

注意:不能使用等号来测试NaN。例如。:

>>> myarr = np.array([1., 0., np.nan, 3.])
>>> np.where(myarr == np.nan)
>>> 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

以下对应于通常的功能,除了从结果中排除nans:

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

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

How numpy handles numerical exceptions

The default is to 'warn' for invalid, divide, and overflow and 'ignore' for underflow. 但是这可以更改,并且可以针对不同种类的异常单独设置。不同的行为是:

  • 'ignore':当异常发生时不采取任何行动。
  • 'warn':打印RuntimeWarning(通过Python warnings模块)。
  • 'raise':提高FloatingPointError
  • 'call':使用seterrcall函数调用指定的函数。
  • 'print':直接向stdout打印警告。
  • 'log':在由seterrcall指定的Log对象中记录错误。

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

  • all:适用于所有数字异常
  • invalid:生成NaN时
  • divide:除以零(整数也是!)
  • overflow:浮点溢出
  • underflow:浮点下溢

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

Examples

>>> 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

Interfacing to C

只有对选择的调查。关于每个工作的细节。

  1. 裸金属,手动包装您自己的C代码。
  • 拼图:
    • 高效
    • 对其他工具没有依赖
  • 减号:
    • 许多学习开销:
      • 需要学习Python C API的基础知识
      • 需要学习numpy C API的基础知识
      • 需要学习如何处理引用计数和爱它。
    • 参考计数往往很难得到正确。
      • 得到它错误导致内存泄漏,更糟糕,segfaults
    • API将为Python 3.0改变!
  1. Cython
  • 拼图:
    • 避免学习C API
    • 没有处理引用计数
    • 可以在伪python中编码并生成C代码
    • 也可以接口到现有的C代码
    • 应该屏蔽你对Python C api的改变
    • 已经成为科学Python社区中的事实上的标准
    • 对数组的快速索引支持
  • 减号:
    • 可以以非标准形式编写可能过时的代码
    • 没有手动包装那么灵活
  1. ctypes
  • 拼图:

    • 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. SWIG(自动包装机)
  • 拼图:
    • 大约很长时间
    • 多脚本语言支持
    • C ++支持
    • 适用于包装大型(许多函数)现有的C库
  • 减号:
    • 在Python和C代码之间生成大量代码
    • 可能导致几乎不可能优化的性能问题
    • 接口文件可能很难写
    • 不一定避免引用计数问题或需要知道API的
  1. scipy.weave
  • 拼图:
    • 可以将许多numpy表达式转换为C代码
    • 动态编译和加载生成的C代码
    • 可以在Python模块中嵌入纯C代码,并编织提取,生成接口和编译等。
  • 减号:
    • 未来非常不确定:它是Scipy的唯一一部分,不移植到Python 3,并且有效地弃用了Cython。
  1. Psyco
  • 拼图:
    • 通过类似jit的优化将纯python变成高效的机器代码
    • 非常快,当它优化好
  • 减号:
    • 只有在intel(windows?)
    • 对numpy不做多少?

Interfacing to Fortran:

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

Pyfort是一个旧的替代品,但不再支持。Fwrap是一个较新的项目,看起来很有希望,但是不再开发。

Interfacing to C++:

  1. Cython
  2. CXX
  3. Boost.python
  4. SWIG
  5. SIP(主要用于PyQT)