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
默认为 'warn' 对于 invalid , divide 和 overflow 和 'ignore' 对于 underflow . 但这可以更改,并且可以针对不同类型的异常单独设置。不同的行为是:
'warn'
invalid
divide
overflow
'ignore'
underflow
“忽略”:发生异常时不采取任何操作。 “警告”:打印 RuntimeWarning (通过Python) warnings 模块)。 “升高”:升高 FloatingPointError . “call”:调用使用 seterrcall 功能。 “print”:将警告直接打印到 stdout . “日志”:在由指定的日志对象中记录错误 seterrcall .
“忽略”:发生异常时不采取任何操作。
“警告”:打印 RuntimeWarning (通过Python) warnings 模块)。
warnings
“升高”:升高 FloatingPointError .
“call”:调用使用 seterrcall 功能。
“print”:将警告直接打印到 stdout .
stdout
“日志”:在由指定的日志对象中记录错误 seterrcall .
这些行为可以针对各种错误或特定错误进行设置:
全部:应用于所有数值异常 无效:生成NAN时 除以:除以零(对于整数也是如此!) 溢出:浮点溢出 下溢:浮点下溢
全部:应用于所有数值异常
无效:生成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代码。
Plusses: 有效的 不依赖其他工具 缺点: 大量的学习开销: 需要学习Python C API的基础知识 需要学习numpy c api的基础知识 需要学习如何处理参考计数并喜欢它。 参考计数通常很难得到正确的结果。 出错会导致内存泄漏,更糟的是,会导致SegFaults API将更改为python 3.0!
Plusses:
有效的
不依赖其他工具
缺点:
大量的学习开销:
需要学习Python C API的基础知识
需要学习numpy c api的基础知识
需要学习如何处理参考计数并喜欢它。
参考计数通常很难得到正确的结果。
出错会导致内存泄漏,更糟的是,会导致SegFaults
API将更改为python 3.0!
赛隆
Plusses: 避免学习C API 不处理参考计数 可以用伪python编码并生成C代码 也可以与现有的C代码接口 应该保护您免受对python c api的更改 已经成为科学 Python 社区中的事实标准 对数组的快速索引支持 缺点: 可以以非标准形式编写可能会过时的代码 不像手工包装那样灵活
避免学习C API
不处理参考计数
可以用伪python编码并生成C代码
也可以与现有的C代码接口
应该保护您免受对python c api的更改
已经成为科学 Python 社区中的事实标准
对数组的快速索引支持
可以以非标准形式编写可能会过时的代码
不像手工包装那样灵活
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扩展的代码,只能使用包装工具。
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扩展的代码,只能使用包装工具。
自动包装机
Plusses: 大约很长时间 多脚本语言支持 C++支持 适合包装大型(多个函数)现有C库 缺点: 在python和c代码之间生成大量代码 可能导致性能问题,几乎不可能优化 接口文件可能难以写入 不一定避免引用计数问题或需要了解API
大约很长时间
多脚本语言支持
C++支持
适合包装大型(多个函数)现有C库
在python和c代码之间生成大量代码
可能导致性能问题,几乎不可能优化
接口文件可能难以写入
不一定避免引用计数问题或需要了解API
scipy.weave
Plusses: 可以将许多numpy表达式转换为C代码 动态编译和加载生成的C代码 可以在python模块中嵌入纯C代码,并有weave提取、生成接口和编译等功能。 缺点: 未来非常不确定:它是scipy中唯一一个没有移植到python 3的部分,实际上已经被弃用,取而代之的是cython。
可以将许多numpy表达式转换为C代码
动态编译和加载生成的C代码
可以在python模块中嵌入纯C代码,并有weave提取、生成接口和编译等功能。
未来非常不确定:它是scipy中唯一一个没有移植到python 3的部分,实际上已经被弃用,取而代之的是cython。
心理医生
Plusses: 通过类似于JIT的优化,将纯Python转换为高效的机器代码 优化得很好,速度很快 缺点: 仅在Intel(Windows?) 对 NumPy 没什么作用?
通过类似于JIT的优化,将纯Python转换为高效的机器代码
优化得很好,速度很快
仅在Intel(Windows?)
对 NumPy 没什么作用?
包装Fortran代码的明确选择是 f2py .
Pyfort是一个较旧的替代方案,但不再受支持。fwrap是一个新的项目,看起来很有希望,但现在还没有开发出来。
赛隆 CXX Boost.python SWIG SIP(主要用于PYQT)
CXX
Boost.python
SWIG
SIP(主要用于PYQT)