NumPy其他雜項(xiàng)


IEEE 754 浮點(diǎn)特殊值

在 NumPy 中定義的特殊值可以通過:nan,inf,

NaNs 可以用作簡陋的占位類型(如果你并不在乎初始的值是什么的話)

注意:不能使用相等來測(cè)試 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)容對(duì)應(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ù)字異常的

默認(rèn)值為 Warn 表示無效、Divide和溢出,Ignore表示下溢。
但是這是可以更改的,并且可以針對(duì)不同種類的異常單獨(dú)設(shè)置。不同的行為包括:

  • 'ignore':發(fā)生異常時(shí)不采取任何措施。
  • 'warn':打印 RuntimeWarning (通過Python warnings
  • 模塊)。
  • 'raise':引發(fā) FloatingPointError 。
  • 'call':調(diào)用使用 seterrcall 函數(shù)指定的函數(shù)。
  • 'print':直接打印警告stdout
  • 'log':在 seterrcall 指定的Log對(duì)象中記錄錯(cuò)誤。

可以針對(duì)各種錯(cuò)誤或特定錯(cuò)誤設(shè)置這些行為:

  • all:適用于所有數(shù)字異常
  • 無效:生成NaN時(shí)
  • 除以:除以零(對(duì)于整數(shù)!)
  • 溢出:浮點(diǎn)溢出
  • 下溢:浮點(diǎn)下溢

注意,整數(shù)除零由相同的機(jī)器處理。這些行為是基于每個(gè)線程設(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 的方式

只針對(duì)下列選項(xiàng)進(jìn)行闡述,闡述每一項(xiàng)工作原理的部分細(xì)節(jié)。

  1. 不借助任何工具, 手動(dòng)打包你的C語言代碼。
    • 加分項(xiàng)(優(yōu)點(diǎn)):
      • 高效
      • 不依賴于其他工具
    • 減分項(xiàng)(缺點(diǎn)):
      • 大量的學(xué)習(xí)開銷:
      • 需要學(xué)習(xí)Python C API的基礎(chǔ)知識(shí)
      • 需要學(xué)習(xí)numpy C API的基礎(chǔ)知識(shí)
      • 需要學(xué)習(xí)如何處理引用計(jì)數(shù)并喜歡它。
      • 引用計(jì)數(shù)通常很難正確。
      • 錯(cuò)誤導(dǎo)致內(nèi)存泄漏,更糟糕的是段錯(cuò)誤。
      • Python可能會(huì)改變API!
  2. Cython
    • 加分項(xiàng)(優(yōu)點(diǎn)):
      • 避免學(xué)習(xí)C API
      • 沒有涉及引用計(jì)數(shù)
      • 可以在偽python中編碼并生成C代碼
      • 也可以與現(xiàn)有的C代碼接口
      • 應(yīng)該保護(hù)你免受Python C api的更改
      • 已經(jīng)成為科學(xué)Python社區(qū)中事實(shí)上的標(biāo)準(zhǔn)
      • 對(duì)數(shù)組的快速索引支持
    • 減分項(xiàng)(缺點(diǎn)):
      • 可以用非標(biāo)準(zhǔn)形式編寫可能過時(shí)的代碼
      • 不如手動(dòng)包裝靈活
  3. ctypes
    • 加分項(xiàng)(優(yōu)點(diǎn)):

      • Python標(biāo)準(zhǔn)庫的一部分
      • 適用于連接現(xiàn)有的可共享庫,尤其是Windows DLL
      • 避免API /引用計(jì)數(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
      
    • 減分項(xiàng)(缺點(diǎn)):

      • 不能用于編寫代碼轉(zhuǎn)換為C擴(kuò)展,只能用于包裝工具。
  4. SWIG(自動(dòng)包裝發(fā)生器)
    • 加分項(xiàng)(優(yōu)點(diǎn)):
      • 很長一段時(shí)間
      • 多腳本語言支持
      • C ++支持
      • 適用于包裝大型(許多功能)現(xiàn)有C庫
    • 減分項(xiàng)(缺點(diǎn)):
      • 在Python和C代碼之間生成大量代碼
      • 可能導(dǎo)致幾乎無法優(yōu)化的性能問題
      • 接口文件很難寫
      • 不一定避免引用計(jì)數(shù)問題或需要知道API
  5. scipy.weave
    • 加分項(xiàng)(優(yōu)點(diǎn)):
      • 可以將許多numpy表達(dá)式轉(zhuǎn)換為C代碼
      • 動(dòng)態(tài)編譯和加載生成的C代碼
      • 可以在Python模塊中嵌入純C代碼,并編織提取,生成接口和編譯等。
    • 減分項(xiàng)(缺點(diǎn)):
      • 未來非常不確定:它是Scipy中唯一沒有移植到Python 3的部分,并且有效地棄用了Cython。
  6. Psyco
    • 加分項(xiàng)(優(yōu)點(diǎn)):
      • 通過類似jit的優(yōu)化將純python轉(zhuǎn)換為高效的機(jī)器代碼
      • 當(dāng)它優(yōu)化得很好時(shí)非???/li>
    • 減分項(xiàng)(缺點(diǎn)):
      • 只在intel(windows?)上
      • 對(duì)numpy沒有多大作用?

Fortran 的接口:

包裝 Fortran 代碼的明確選擇是 f2py

Pyfort是一個(gè)較舊的選擇,但不再支持。Fwrap是一個(gè)看起來很有希望但不再開發(fā)的新項(xiàng)目。

連接到 C++ 有以下幾個(gè)方式:

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

作者:柯廣的網(wǎng)絡(luò)日志 ? NumPy其他雜項(xiàng)

微信公眾號(hào):Java大數(shù)據(jù)與數(shù)據(jù)倉庫