NumPy其他雜項
IEEE 754 浮點特殊值
在 NumPy 中定義的特殊值可以通過:nan,inf,
NaNs 可以用作簡陋的占位類型(如果你并不在乎初始的值是什么的話)
注意:不能使用相等來測試 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.])
其他的相關(guān)的特殊值判斷函數(shù)
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
除了從結(jié)果中排除nans之外,以下內(nèi)容對應(yīng)于常用函數(shù):
nansum()
nanmax()
nanmin()
nanargmax()
nanargmin()
>>> x = np.arange(10.)
>>> x[3] = np.nan
>>> x.sum()
nan
>>> np.nansum(x)
42.0
NumPy 如何處理數(shù)字異常的
默認值為 Warn
表示無效、Divide
和溢出,Ignore
表示下溢。
但是這是可以更改的,并且可以針對不同種類的異常單獨設(shè)置。不同的行為包括:
- 'ignore':發(fā)生異常時不采取任何措施。
- 'warn':打印 RuntimeWarning (通過Python
warnings
- 模塊)。
- 'raise':引發(fā) FloatingPointError 。
- 'call':調(diào)用使用 seterrcall 函數(shù)指定的函數(shù)。
- 'print':直接打印警告
stdout
。 - 'log':在 seterrcall 指定的Log對象中記錄錯誤。
可以針對各種錯誤或特定錯誤設(shè)置這些行為:
- all:適用于所有數(shù)字異常
- 無效:生成NaN時
- 除以:除以零(對于整數(shù)?。?/li>
- 溢出:浮點溢出
- 下溢:浮點下溢
注意,整數(shù)除零由相同的機器處理。這些行為是基于每個線程設(shè)置的。
示例
>>> 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 的方式
只針對下列選項進行闡述,闡述每一項工作原理的部分細節(jié)。
- 不借助任何工具, 手動打包你的C語言代碼。
- 加分項(優(yōu)點):
- 高效
- 不依賴于其他工具
- 減分項(缺點):
- 大量的學習開銷:
- 需要學習Python C API的基礎(chǔ)知識
- 需要學習numpy C API的基礎(chǔ)知識
- 需要學習如何處理引用計數(shù)并喜歡它。
- 引用計數(shù)通常很難正確。
- 錯誤導致內(nèi)存泄漏,更糟糕的是段錯誤。
- Python可能會改變API!
- 加分項(優(yōu)點):
- Cython
- 加分項(優(yōu)點):
- 避免學習C API
- 沒有涉及引用計數(shù)
- 可以在偽python中編碼并生成C代碼
- 也可以與現(xiàn)有的C代碼接口
- 應(yīng)該保護你免受Python C api的更改
- 已經(jīng)成為科學Python社區(qū)中事實上的標準
- 對數(shù)組的快速索引支持
- 減分項(缺點):
- 可以用非標準形式編寫可能過時的代碼
- 不如手動包裝靈活
- 加分項(優(yōu)點):
- ctypes
-
加分項(優(yōu)點):
- Python標準庫的一部分
- 適用于連接現(xiàn)有的可共享庫,尤其是Windows DLL
- 避免API /引用計數(shù)問題
- 良好的numpy支持:數(shù)組在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
-
減分項(缺點):
- 不能用于編寫代碼轉(zhuǎn)換為C擴展,只能用于包裝工具。
-
- SWIG(自動包裝發(fā)生器)
- 加分項(優(yōu)點):
- 很長一段時間
- 多腳本語言支持
- C ++支持
- 適用于包裝大型(許多功能)現(xiàn)有C庫
- 減分項(缺點):
- 在Python和C代碼之間生成大量代碼
- 可能導致幾乎無法優(yōu)化的性能問題
- 接口文件很難寫
- 不一定避免引用計數(shù)問題或需要知道API
- 加分項(優(yōu)點):
- scipy.weave
- 加分項(優(yōu)點):
- 可以將許多numpy表達式轉(zhuǎn)換為C代碼
- 動態(tài)編譯和加載生成的C代碼
- 可以在Python模塊中嵌入純C代碼,并編織提取,生成接口和編譯等。
- 減分項(缺點):
- 未來非常不確定:它是Scipy中唯一沒有移植到Python 3的部分,并且有效地棄用了Cython。
- 加分項(優(yōu)點):
- Psyco
- 加分項(優(yōu)點):
- 通過類似jit的優(yōu)化將純python轉(zhuǎn)換為高效的機器代碼
- 當它優(yōu)化得很好時非???/li>
- 減分項(缺點):
- 只在intel(windows?)上
- 對numpy沒有多大作用?
- 加分項(優(yōu)點):
Fortran 的接口:
包裝 Fortran 代碼的明確選擇是 f2py。
Pyfort是一個較舊的選擇,但不再支持。Fwrap是一個看起來很有希望但不再開發(fā)的新項目。
連接到 C++ 有以下幾個方式:
- Cython
- CXX
- Boost.Python
- SWIG
- SIP(主要用于PyQT)
作者:柯廣的網(wǎng)絡(luò)日志 ? NumPy其他雜項
微信公眾號:Java大數(shù)據(jù)與數(shù)據(jù)倉庫