NumPy 數(shù)據(jù)類型

2021-09-01 10:16 更新

1、數(shù)組類型和類型之間的轉(zhuǎn)換

NumPy 支持的數(shù)值類型比 Python 多得多。本節(jié)顯示哪些可用,以及如何修改數(shù)組的數(shù)據(jù)類型。 支持的基本類型與 C 中的基本類型密切相關(guān):

Numpy 類型 C型 描述
numpy.bool_ bool 存儲為字節(jié)的布爾值(真或假)
numpy.byte signed?char 平臺定義
numpy.ubyte unsigned?char 平臺定義
numpy.short short 平臺定義
numpy.ushort unsigned?short 平臺定義
numpy.intc int 平臺定義
numpy.uintc unsigned?int 平臺定義
numpy.int_ long 平臺定義
numpy.uint unsigned?long 平臺定義
numpy.longlong long?long 平臺定義
numpy.ulonglong unsigned?long?long 平臺定義
numpy.half? ?numpy.float16 半精度浮點(diǎn)數(shù):符號位,5 位指數(shù),10 位尾數(shù)
numpy.single float 平臺定義的單精度浮點(diǎn)數(shù):通常為符號位、8 位指數(shù)、23 位尾數(shù)
numpy.double double 平臺定義的雙精度浮點(diǎn)數(shù):通常為符號位、11 位指數(shù)、52 位尾數(shù)。
numpy.longdouble long?double 平臺定義的擴(kuò)展精度浮點(diǎn)數(shù)
numpy.csingle float?complex 復(fù)數(shù),由兩個單精度浮點(diǎn)數(shù)表示(實(shí)部和虛部)
numpy.cdouble double?complex 復(fù)數(shù),由兩個雙精度浮點(diǎn)數(shù)(實(shí)部和虛部)表示。
numpy.clongdouble long?double?complex 復(fù)數(shù),由兩個擴(kuò)展精度浮點(diǎn)數(shù)(實(shí)部和虛部)表示。

由于其中許多具有平臺相關(guān)的定義,因此提供了一組固定大小的別名(請參閱大小別名)。

NumPy 數(shù)字類型是dtype(數(shù)據(jù)類型)對象的實(shí)例,每個對象都有獨(dú)特的特征。使用導(dǎo)入 NumPy 后

>>> import numpy as np

在dtypes可作為np.bool_,np.float32等等。

上面未列出的高級類型在結(jié)構(gòu)化數(shù)組部分進(jìn)行了探討。

有 5 種基本數(shù)字類型表示布爾值 (bool)、整數(shù) (int)、無符號整數(shù) (uint) 浮點(diǎn)數(shù) (float) 和復(fù)數(shù)。名稱中帶有數(shù)字的那些表示類型的位大?。幢硎緝?nèi)存中的單個值需要多少位)。某些類型(例如int和?intp)具有不同的位大小,具體取決于平臺(例如 32 位與 64 位機(jī)器)。在與尋址原始內(nèi)存的低級代碼(例如 C 或 Fortran)接口時,應(yīng)考慮到這一點(diǎn)。

數(shù)據(jù)類型可以用作將 python 數(shù)字轉(zhuǎn)換為數(shù)組標(biāo)量的函數(shù)(有關(guān)解釋,請參閱數(shù)組標(biāo)量部分),將數(shù)字的 python 序列轉(zhuǎn)換為該類型的數(shù)組,或作為許多 numpy 函數(shù)或方法接受的 dtype 關(guān)鍵字的參數(shù).?一些例子:

>>> import numpy as np
>>> x = np.float32(1.0)
>>> x
1.0
>>> y = np.int_([1,2,4])
>>> y
array([1, 2, 4])
>>> z = np.arange(3, dtype=np.uint8)
>>> z
array([0, 1, 2], dtype=uint8)

數(shù)組類型也可以通過字符代碼引用,主要是為了保持與舊包(如 Numeric)的向后兼容性。一些文檔可能仍然引用這些,例如:

>>> np.array([1, 2, 3], dtype='f')
array([ 1.,  2.,  3.], dtype=float32)

我們建議改用 dtype 對象。

要轉(zhuǎn)換數(shù)組的類型,請使用 .astype() 方法(首選)或類型本身作為函數(shù)。例如:

>>> z.astype(float)
array([  0.,  1.,  2.])
>>> np.int8(z)
array([0, 1, 2], dtype=int8)

請注意,在上面,我們使用Python浮點(diǎn)對象作為 dtype。NumPy的人都知道int是指np.int_,bool手段np.bool_,那floatnp.float_complexnp.complex_。其他數(shù)據(jù)類型沒有 Python 等價物。

要確定數(shù)組的類型,請查看 dtype 屬性:

>>> z.dtype
dtype('uint8')

dtype 對象還包含有關(guān)類型的信息,例如其位寬和字節(jié)順序。數(shù)據(jù)類型也可以間接用于查詢該類型的屬性,例如是否為整數(shù):

>>> d = np.dtype(int)
>>> d
dtype('int32')


>>> np.issubdtype(d, np.integer)
True


>>> np.issubdtype(d, np.floating)
False

2、數(shù)組標(biāo)量

NumPy 通常將數(shù)組元素作為數(shù)組標(biāo)量(具有關(guān)聯(lián) dtype 的標(biāo)量)返回。數(shù)組標(biāo)量與 Python 標(biāo)量不同,但在大多數(shù)情況下,它們可以互換使用(主要的例外是 v2.x 之前的 Python 版本,其中整數(shù)數(shù)組標(biāo)量不能作為列表和元組的索引)。有一些例外,例如當(dāng)代碼需要標(biāo)量的非常具體的屬性時,或者當(dāng)它專門檢查一個值是否是 Python 標(biāo)量時。通常,通過使用相應(yīng)的 Python 類型函數(shù)(例如intfloatcomplexstr、unicode)將數(shù)組標(biāo)量顯式轉(zhuǎn)換為 Python 標(biāo)量,可以輕松解決問題。

使用數(shù)組標(biāo)量的主要優(yōu)點(diǎn)是它們保留了數(shù)組類型(Python 可能沒有可用的匹配標(biāo)量類型,例如int16)。因此,使用數(shù)組標(biāo)量可確保數(shù)組和標(biāo)量之間的行為相同,無論該值是否在數(shù)組內(nèi)。NumPy 標(biāo)量也有許多與數(shù)組相同的方法。

3、溢出錯誤

當(dāng)值需要比數(shù)據(jù)類型中可用的更多內(nèi)存時,NumPy 數(shù)字類型的固定大小可能會導(dǎo)致溢出錯誤。例如,?對于 64 位整數(shù)numpy.power計算正確,但對于 32 位整數(shù)給出 1874919424(不正確)。100?**?8

>>> np.power(100, 8, dtype=np.int64)
10000000000000000
>>> np.power(100, 8, dtype=np.int32)
1874919424

NumPy 和 Python 整數(shù)類型的行為在整數(shù)溢出方面存在顯著差異,并且可能會使期望 NumPy 整數(shù)行為類似于 Python 的int.?與 NumPy 不同,Python 的大小int是靈活的。這意味著 Python 整數(shù)可以擴(kuò)展以容納任何整數(shù)并且不會溢出。

NumPy 提供numpy.iinfonumpy.finfo分別驗(yàn)證 NumPy 整數(shù)和浮點(diǎn)值的最小值或最大值

>>> np.iinfo(int) # Bounds of the default integer on this system.
iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
>>> np.iinfo(np.int32) # Bounds of a 32-bit integer
iinfo(min=-2147483648, max=2147483647, dtype=int32)
>>> np.iinfo(np.int64) # Bounds of a 64-bit integer
iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)

如果 64 位整數(shù)仍然太小,則結(jié)果可能會轉(zhuǎn)換為浮點(diǎn)數(shù)。浮點(diǎn)數(shù)提供了更大但不精確的可能值范圍。

>>> np.power(100, 100, dtype=np.int64) # Incorrect even with 64-bit int
0
>>> np.power(100, 100, dtype=np.float64)
1e+200

4、擴(kuò)展精度

Python 的浮點(diǎn)數(shù)通常是 64 位浮點(diǎn)數(shù),幾乎相當(dāng)于np.float64.?在某些不尋常的情況下,使用更精確的浮點(diǎn)數(shù)可能會很有用。這在 numpy 中是否可行取決于硬件和開發(fā)環(huán)境:具體來說,x86 機(jī)器提供具有 80 位精度的硬件浮點(diǎn),雖然大多數(shù) C 編譯器都提供這種?類型,但 MSVC(Windows 構(gòu)建的標(biāo)準(zhǔn))使得?等同于(64 位)。NumPy 使編譯器可用作(以及?用于復(fù)數(shù))。您可以找出 numpy 提供的內(nèi)容。long?double``long?double``double``long?double``np.longdouble``np.clongdouble``np.finfo(np.longdouble)

NumPy 不提供比 C 的\更精確的 dtype?;特別是 128 位 IEEE 四精度數(shù)據(jù)類型(FORTRAN 的\)不可用。long?double``REAL*16

為了有效的內(nèi)存對齊,np.longdouble通常用零位填充存儲,要么是 96 位要么是 128 位。哪個更高效取決于硬件和開發(fā)環(huán)境;通常在 32 位系統(tǒng)上它們被填充到 96 位,而在 64 位系統(tǒng)上它們通常被填充到 128 位。np.longdouble填充到系統(tǒng)默認(rèn)值;np.float96np.float128為需要特定填充的用戶提供。盡管有這些名稱,np.float96并且?np.float128僅提供與 一樣多的精度np.longdouble,即大多數(shù) x86 機(jī)器上的 80 位和標(biāo)準(zhǔn) Windows 版本中的 64 位。

請注意,即使np.longdouble提供比 python 更高的精度float,也很容易失去額外的精度,因?yàn)?python 經(jīng)常強(qiáng)制值通過float。例如,%格式化操作符要求將其參數(shù)轉(zhuǎn)換為標(biāo)準(zhǔn)的 Python 類型,因此即使請求了許多小數(shù)位,也無法保留擴(kuò)展精度。使用值測試您的代碼會很有用?。1?+?np.finfo(np.longdouble).eps

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號