NumPy 支持的數值類型比 Python 多得多。本節(jié)顯示哪些可用,以及如何修改數組的數據類型。 支持的基本類型與 C 中的基本類型密切相關:
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 |
半精度浮點數:符號位,5 位指數,10 位尾數 |
numpy.single |
float |
平臺定義的單精度浮點數:通常為符號位、8 位指數、23 位尾數 |
numpy.double |
double |
平臺定義的雙精度浮點數:通常為符號位、11 位指數、52 位尾數。 |
numpy.longdouble |
long?double |
平臺定義的擴展精度浮點數 |
numpy.csingle |
float?complex |
復數,由兩個單精度浮點數表示(實部和虛部) |
numpy.cdouble |
double?complex |
復數,由兩個雙精度浮點數(實部和虛部)表示。 |
numpy.clongdouble |
long?double?complex |
復數,由兩個擴展精度浮點數(實部和虛部)表示。 |
由于其中許多具有平臺相關的定義,因此提供了一組固定大小的別名(請參閱大小別名)。
NumPy 數字類型是dtype
(數據類型)對象的實例,每個對象都有獨特的特征。使用導入 NumPy 后
>>> import numpy as np
在dtypes可作為np.bool_
,np.float32
等等。
上面未列出的高級類型在結構化數組部分進行了探討。
有 5 種基本數字類型表示布爾值 (bool)、整數 (int)、無符號整數 (uint) 浮點數 (float) 和復數。名稱中帶有數字的那些表示類型的位大?。幢硎緝却嬷械膯蝹€值需要多少位)。某些類型(例如int
和?intp
)具有不同的位大小,具體取決于平臺(例如 32 位與 64 位機器)。在與尋址原始內存的低級代碼(例如 C 或 Fortran)接口時,應考慮到這一點。
數據類型可以用作將 python 數字轉換為數組標量的函數(有關解釋,請參閱數組標量部分),將數字的 python 序列轉換為該類型的數組,或作為許多 numpy 函數或方法接受的 dtype 關鍵字的參數.?一些例子:
>>> 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)
數組類型也可以通過字符代碼引用,主要是為了保持與舊包(如 Numeric)的向后兼容性。一些文檔可能仍然引用這些,例如:
>>> np.array([1, 2, 3], dtype='f')
array([ 1., 2., 3.], dtype=float32)
我們建議改用 dtype 對象。
要轉換數組的類型,請使用 .astype() 方法(首選)或類型本身作為函數。例如:
>>> z.astype(float)
array([ 0., 1., 2.])
>>> np.int8(z)
array([0, 1, 2], dtype=int8)
請注意,在上面,我們使用Python浮點對象作為 dtype。NumPy的人都知道int
是指np.int_
,bool
手段np.bool_
,那float
是np.float_
和complex
是np.complex_
。其他數據類型沒有 Python 等價物。
要確定數組的類型,請查看 dtype 屬性:
>>> z.dtype
dtype('uint8')
dtype 對象還包含有關類型的信息,例如其位寬和字節(jié)順序。數據類型也可以間接用于查詢該類型的屬性,例如是否為整數:
>>> d = np.dtype(int)
>>> d
dtype('int32')
>>> np.issubdtype(d, np.integer)
True
>>> np.issubdtype(d, np.floating)
False
NumPy 通常將數組元素作為數組標量(具有關聯(lián) dtype 的標量)返回。數組標量與 Python 標量不同,但在大多數情況下,它們可以互換使用(主要的例外是 v2.x 之前的 Python 版本,其中整數數組標量不能作為列表和元組的索引)。有一些例外,例如當代碼需要標量的非常具體的屬性時,或者當它專門檢查一個值是否是 Python 標量時。通常,通過使用相應的 Python 類型函數(例如int
、float
、complex
、str
、unicode
)將數組標量顯式轉換為 Python 標量,可以輕松解決問題。
使用數組標量的主要優(yōu)點是它們保留了數組類型(Python 可能沒有可用的匹配標量類型,例如int16
)。因此,使用數組標量可確保數組和標量之間的行為相同,無論該值是否在數組內。NumPy 標量也有許多與數組相同的方法。
當值需要比數據類型中可用的更多內存時,NumPy 數字類型的固定大小可能會導致溢出錯誤。例如,?對于 64 位整數numpy.power
計算正確,但對于 32 位整數給出 1874919424(不正確)。100?**?8
>>> np.power(100, 8, dtype=np.int64)
10000000000000000
>>> np.power(100, 8, dtype=np.int32)
1874919424
NumPy 和 Python 整數類型的行為在整數溢出方面存在顯著差異,并且可能會使期望 NumPy 整數行為類似于 Python 的int
.?與 NumPy 不同,Python 的大小int
是靈活的。這意味著 Python 整數可以擴展以容納任何整數并且不會溢出。
NumPy 提供numpy.iinfo
并numpy.finfo
分別驗證 NumPy 整數和浮點值的最小值或最大值
>>> 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 位整數仍然太小,則結果可能會轉換為浮點數。浮點數提供了更大但不精確的可能值范圍。
>>> np.power(100, 100, dtype=np.int64) # Incorrect even with 64-bit int
0
>>> np.power(100, 100, dtype=np.float64)
1e+200
Python 的浮點數通常是 64 位浮點數,幾乎相當于np.float64
.?在某些不尋常的情況下,使用更精確的浮點數可能會很有用。這在 numpy 中是否可行取決于硬件和開發(fā)環(huán)境:具體來說,x86 機器提供具有 80 位精度的硬件浮點,雖然大多數 C 編譯器都提供這種?類型,但 MSVC(Windows 構建的標準)使得?等同于(64 位)。NumPy 使編譯器可用作(以及?用于復數)。您可以找出 numpy 提供的內容。long?double``long?double``double``long?double``np.longdouble``np.clongdouble``np.finfo(np.longdouble)
NumPy 不提供比 C 的\更精確的 dtype?;特別是 128 位 IEEE 四精度數據類型(FORTRAN 的\)不可用。long?double``REAL*16
為了有效的內存對齊,np.longdouble
通常用零位填充存儲,要么是 96 位要么是 128 位。哪個更高效取決于硬件和開發(fā)環(huán)境;通常在 32 位系統(tǒng)上它們被填充到 96 位,而在 64 位系統(tǒng)上它們通常被填充到 128 位。np.longdouble
填充到系統(tǒng)默認值;np.float96
并np.float128
為需要特定填充的用戶提供。盡管有這些名稱,np.float96
并且?np.float128
僅提供與 一樣多的精度np.longdouble
,即大多數 x86 機器上的 80 位和標準 Windows 版本中的 64 位。
請注意,即使np.longdouble
提供比 python 更高的精度float
,也很容易失去額外的精度,因為 python 經常強制值通過float
。例如,%
格式化操作符要求將其參數轉換為標準的 Python 類型,因此即使請求了許多小數位,也無法保留擴展精度。使用值測試您的代碼會很有用?。1?+?np.finfo(np.longdouble).eps
更多建議: