也可以看看
NumPy比Python支持更多的数字类型。本节显示哪些可用,以及如何修改数组的数据类型。
支持的基本类型与C中的紧密相关:
脾气暴躁型 |
C型 |
描述 |
---|---|---|
np.bool_ |
|
布尔值(True或False)存储为字节 |
字节数 |
|
平台定义 |
np.ubyte |
|
平台定义 |
np.short |
|
平台定义 |
np.ushort |
|
平台定义 |
np.intc |
|
平台定义 |
np.uintc |
|
平台定义 |
np.int_ |
|
平台定义 |
np.uint |
|
平台定义 |
龙龙 |
|
平台定义 |
龙龙 |
|
平台定义 |
np.half / np.float16 |
半精度浮点数:符号位,5位指数,10位尾数 |
|
单人 |
|
平台定义的单精度浮点数:通常为符号位,8位指数,23位尾数 |
np.double |
|
平台定义的双精度浮点数:通常为符号位,11位指数,52位尾数。 |
np.longdouble |
|
平台定义的扩展精度浮点数 |
np.csingle |
|
复数,由两个单精度浮点数表示(实部和虚部) |
np.cdouble |
|
复数,由两个双精度浮点数(实部和虚部)表示。 |
np.clongdouble |
|
复数,由两个扩展精度浮点数(实部和虚部)表示。 |
由于其中许多具有平台相关的定义,因此提供了一组固定大小的别名:
脾气暴躁型 |
C型 |
描述 |
---|---|---|
np.int8 |
|
字节(-128至127) |
np.int16 |
|
整数(-32768至32767) |
np.int32 |
|
整数(-2147483648至2147483647) |
np.int64 |
|
整数(-9223372036854775808至9223372036854775807) |
np.uint8 |
|
无符号整数(0到255) |
np.uint16 |
|
无符号整数(0到65535) |
np.uint32 |
|
无符号整数(0到4294967295) |
np.uint64 |
|
无符号整数(0至18446744073709551615) |
np.intp |
|
用于索引的整数,通常与 |
np.uintp |
|
足够大以容纳指针的整数 |
np.float32 |
|
|
np.float64 / np.float_ |
|
请注意,这与内置python float的精度匹配。 |
np.complex64 |
|
复数,由两个32位浮点数表示(实部和虚部) |
np.complex128 / np.complex_ |
|
请注意,这与内置python complex的精度匹配。 |
NumPy数值类型是dtype
(数据类型)对象的实例,每个对象都有独特的特征。导入NumPy后,请使用
>>> import numpy as np
在dtypes可作为np.bool_
,np.float32
等等。
上表中未列出的高级类型在“ 结构化数组”部分中进行了探讨。
有5种基本的数值类型,分别代表布尔(布尔),整数(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 float对象用作dtype。NumPy的人都知道int
是指np.int_
,bool
手段np.bool_
,那float
是np.float_
和complex
是np.complex_
。其他数据类型没有Python等效项。
要确定数组的类型,请查看dtype属性:
>>> z.dtype
dtype('uint8')
dtype对象还包含有关类型的信息,例如其位宽和字节顺序。数据类型也可以间接用于查询该类型的属性,例如是否为整数:
>>> d = np.dtype(int)
>>> d
dtype('int32')
>>> np.issubdtype(d, np.integer)
True
>>> np.issubdtype(d, np.floating)
False
NumPy通常以数组标量(具有关联的dtype的标量)的形式返回数组的元素。数组标量与Python标量不同,但是它们在大多数情况下可以互换使用(主要的例外是v2.x之前的Python版本,其中整数数组标量不能用作列表和元组的索引)。有一些例外,例如,当代码需要标量的非常特定的属性时,或者当代码专门检查值是否为Python标量时。通常,存在的问题很容易被显式转换阵列标量到Python标量,采用相应的Python类型功能固定的(例如,int
,float
,complex
,str
,unicode
)。
使用数组标量的主要优点是它们保留了数组类型(Python可能没有可用的匹配标量类型,例如int16
)。因此,使用数组标量可以确保数组和标量之间的行为相同,而不管该值是否在数组内部。NumPy标量也具有许多与数组相同的方法。
当值需要的数据量大于数据类型中可用的内存量时,NumPy数值类型的固定大小可能会导致溢出错误。例如,
正确numpy.power
评估64位整数,但给出32749整数的1874919424(不正确)。100 * 10 ** 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中实现取决于硬件和开发环境:具体来说,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's )不可用。long double
REAL*16
为了有效地进行内存对齐,np.longdouble
通常使用零位填充存储到96或128位。哪个更有效取决于硬件和开发环境;通常在32位系统上,它们被填充为96位,而在64位系统上,它们通常被填充为128位。np.longdouble
被填充为系统默认值;np.float96
并np.float128
为需要特定填充的用户提供。尽管有这些名称,np.float96
并且
np.float128
仅提供与一样高的精度np.longdouble
,即在大多数x86机器上为80位,在标准Windows版本中为64位。
请注意,即使np.longdouble
提供比python更高的精度float
,也容易失去这种额外的精度,因为python经常会强制值通过float
。例如,%
格式化操作符要求将其参数转换为标准python类型,因此即使请求了许多小数位,也无法保持扩展的精度。使用value测试代码可能很有用
。1 + np.finfo(np.longdouble).eps