Numpy 数据类型
导包
import numpy as np
【1】数组类型和类型之间的转换
NumPy支持比Python更多的数字类型。
支持的基元类型与 C语言 中的基元类型密切相关:
NumPy 数值类型是 dtype(数据类型)对象的实例,每个对象都具有独特的特征。
有 5 种基本数值类型,分别表示布尔值(布尔值)、整数(整数)、无符号整数 (uint)、浮点数(浮点数)和复数。名称中带有数字的那些表示类型的位大小(即表示内存中的单个值需要多少位)。某些类型(如 int 和 intp)具有不同的位大小,具体取决于平台(例如 32 位与 64 位计算机)。在与寻址原始内存的低级代码(如 C 或 Fortran)接口时,应考虑这一点。
数据类型可以用作将 python 数字转换为数组标量的函数,将数字序列用作该类型的数组,或者用作许多 numpy 函数或方法接受的 dtype 关键字的参数。一些例子:
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)
np.array([1, 2, 3], dtype='f').dtype
dtype('float32')
但是建议改用 dtype 对象。
要转换数组的类型,请使用 .astype() 方法(首选)或类型本身作为函数。例如:
print(z.dtype)
uint8
z.astype(float)
array([0., 1., 2.])
z.astype(float).dtype
dtype('float64')
np.int8(z).dtype
dtype('int8')
请注意,上面,我们使用 Python 浮点对象作为 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
【2】数组标量
NumPy 通常将数组的元素作为数组标量(具有关联 dtype 的标量)返回。数组标量与 Python 标量不同,但在大多数情况下它们可以互换使用(主要例外是早于 v2.x 的 Python 版本,其中整数数组标量不能充当列表和元组的索引)。有一些例外,例如当代码需要非常具体的标量属性时,或者当它专门检查值是否是 Python 标量时。通常,通过使用相应的 Python 类型函数(例如,int、float、complex、str、unicode).
使用数组标量的主要优点是它们保留了数组类型(Python 可能没有匹配的标量类型可用,例如 int16)。因此,使用数组标量可确保数组和标量之间的行为相同,无论值是否在数组内。NumPy 标量也有许多与数组相同的方法。
【3】溢出错误
当值需要的内存多于数据类型中的可用内存时,NumPy 数值类型的固定大小可能会导致溢出错误。例如,numpy.power 对 64 位整数正确计算 100 ** 8,但对 32 位整数给出1874919424(不正确)。
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 整数和浮点值的最小值或最大值numpy.finfo
np.iinfo(int)
iinfo(min=-2147483648, max=2147483647, dtype=int32)
np.iinfo(np.int32)
iinfo(min=-2147483648, max=2147483647, dtype=int32)
np.iinfo(np.int64)
iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
如果 64 位整数仍然太小,则结果可能会转换为浮点数。浮点数提供更大但不精确的可能值范围。
np.power(100, 100, dtype=np.int64)
0
np.power(100, 100, dtype=np.float64)
1e+200
【4】扩展精度
Python 的浮点数通常是 64 位浮点数,几乎等同于 np.float64。在某些异常情况下,更精确地使用浮点数可能很有用。这在 numpy 中是否可行取决于硬件和开发环境:具体来说,x86 机器提供具有 80 位精度的硬件浮点数,虽然大多数 C 编译器将其作为long double长双精度类型提供,但 MSVC(Windows 构建的标准)使long doubledouble(64 位)相同。NumPy使编译器的long double可用作np.longdouble(和np.longdouble用于复数)。np.clongdouble你可以通过np.finfo(np.longdouble)找出你的numpy提供了什么.
NumPy 不提供比 C 的long double更高的 dtype;特别是,128位IEEE四精度数据类型(FORTRAN的REAL*16)不可用。
为了有效地对齐内存,np.longdouble 通常以零位填充存储,可以是 96 位还是 128 位。哪个更有效取决于硬件和开发环境;通常在 32 位系统上,它们填充为 96 位,而在 64 位系统上,它们通常填充为 128 位。np.longdouble 填充到系统默认值;np.float96 和 np.float128 是为需要特定填充的用户提供的。np.float96尽管名称不同,np.float96 和 np.float128 仅提供与 np.longdouble 一样多的精度,即在大多数 x86 机器上为 80 位,在标准 Windows 版本中为 64 位。np.float128
请注意,即使 np.longdouble 提供比 python float 更高的精度,也很容易失去额外的精度,因为 python 经常强制值通过 float。float例如,% 格式化运算符要求将其参数转换为标准 python 类型,因此即使请求了许多小数位,也无法保持扩展精度。使用值 1 + np.finfo(np.longdouble).eps 测试代码可能很有用.eps.