Python 中 NumPy 的数据类型

本文详细介绍了NumPy中的各种数据类型,包括布尔值、整数、无符号整数、浮点数和复数,以及这些类型与C语言类型的对应关系。同时,文章解释了如何在不同类型间进行转换,以及在操作过程中可能出现的溢出错误。
部署运行你感兴趣的模型镜像

数组类型之间的转换

NumPy 中有些数据类型是与 C 中的数据类型是类似的。

Numpy 的类型C 的类型描述
np.boolbool存储为字节的布尔值(True或False)
np.bytesigned char平台定义
np.ubyteunsigned char平台定义
np.shortshort平台定义
np.ushortunsigned short平台定义
np.intcint平台定义
np.uintcunsigned int平台定义
np.int_long平台定义
np.uintunsigned long平台定义
np.longlonglong long平台定义
np.ulonglongunsigned long long平台定义
np.half / np.float16 半精度浮点数:符号位,5位指数,10位尾数
np.singlefloat平台定义的单精度浮点数:通常为符号位,8位指数,23位尾数
np.doubledouble平台定义的双精度浮点数:通常为符号位,11位指数,52位尾数。
np.longdoublelong double平台定义的扩展精度浮点数
np.csinglefloat complex复数,由两个单精度浮点数(实部和虚部)表示
np.cdoubledouble complex复数,由两个双精度浮点数(实部和虚部)表示。
np.clongdoublelong double complex复数,由两个扩展精度浮点数(实部和虚部)表示。

其中依赖平台本身定义的数据类型有一组固定大小的别名:

Numpy 的类型C 的类型描述
np.int8int8_t字节(-128到127)
np.int16int16_t整数(-32768至32767)
np.int32int32_t整数(-2147483648至2147483647)
np.int64int64_t整数(-9223372036854775808至9223372036854775807)
np.uint8uint8_t无符号整数(0到255)
np.uint16uint16_t无符号整数(0到65535)
np.uint32uint32_t无符号整数(0到4294967295)
np.uint64uint64_t无符号整数(0到18446744073709551615)
np.intpintptr_t用于索引的整数,通常与索引相同 ssize_t
np.uintpuintptr_t整数大到足以容纳指针
np.float32float 
np.float64 / np.float_double与内置 python float 的精度相匹配。
np.complex64float complex复数,由两个32位浮点数(实数和虚数组件)表示
np.complex128 / np.complex_double complex与内置python 复合体的精度相匹配。

NumPy 数值类型是 dtype(数据类型)对象的实例,每个对象都具有独特的特征。使用下述语句导入 NumPy

>>> import numpy as np

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

有 5 种基本数字类型表示布尔值(bool),整数(int),无符号整数(uint)浮点(浮点数)和复数。名称中带有数字的那些表示该类型的位大小(即,在内存中表示单个值需要多少位)。某些类型(例如 int 和 intp)具有不同的位,取决于平台(例如,32位与64位计算机)。

数据类型可以用作将 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)

要转换数组的类型,请使用 .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 标量不同,但在大多数情况下它们可以互换使用。有一些例外,例如当代码需要标量的非常特定的属性或者它特定地检查值是否是 Python 标量时。通常,存在的问题很容易被显式转换数组标量到 Python 标量,采用相应的 Python 类型的功能(例如,固定的 int,float,complex,str,unicode)。

使用数组标量的主要优点是它们保留了数组类型(Python 可能没有匹配的标量类型,例如 int16)。因此,使用数组标量可确保数组和标量之间的相同行为,无论值是否在数组内。NumPy 标量也有许多与数组相同的方法。

建议在较多使用 ndarray 对象的地方,使用统一的数据类型,避免数据之间繁琐显式转换。

溢出错误

当值需要比数据类型中的可用内存更多的内存时,NumPy 数值类型的固定大小可能会导致溢出错误。如:

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

NumPy 和 Python 整数类型的行为在整数溢出方面存在显着差异。与 NumPy 不同,Python 的大小 int 是灵活的。这意味着 Python 整数可以扩展以容纳任何整数并且不会溢出。

NumPy 分别提供 numpy.iinfo 和 numpy.finfo 验证 NumPy 整数和浮点值的最小值或最大值:

>>> np.iinfo(np.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 编译器提供这一点作为它们的 long double 类型,MSVC(Windows 构建的标准)使 long double 等同于 double (64位)。NumPy 使编译器的 long double 作为 np.longdouble 可用(而 np.clongdouble 用于复数)。

NumPy 不提供比 C 的 long double 更高精度的 dtype;特别是 128 位 IEEE 四精度数据类型不可用。

参考资料:

1. NumPy 官方文档:https://numpy.org/devdocs/

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### Python NumPy 数据类型概述 NumPyPython 科学计算领域的重要工具,其核心功能之一是对多维数组的支持。为了高效存储和操作数据,NumPy 提供了一系列丰富的数据类型[^3]。 #### 常见的 NumPy 数据类型 以下是 NumPy 支持的主要数据类型及其描述: | 类型 | 描述 | |--------------|----------------------------------------| | `bool_` | 存储布尔值 (True 或 False),相当于 C 的 bool 类型[^1]。 | | `int_` | 默认整数类型,通常为 `long int`[^2]。 | | `int8` 至 `int64` | 不同位宽的有符号整数类型,范围从小到大依次扩展。 | | `uint8` 至 `uint64` | 不同位宽的无符号整数类型,同样按位宽区分。 | | `float_` | 浮点数,默认为双精度浮点数 (`double`)。 | | `float16` 至 `float64` | 单精度至四倍精度浮点数类型。 | | `complex_` | 复数类型,默认为双精度复数 (`complex double`)。 | 这些数据类型不仅涵盖了 Python 内置的基本类型,还能与 C 语言的数据类型一一对应,从而实现更高效的内存管理和跨平台兼容性。 #### 创建指定数据类型的数组 可以通过多种方式定义 NumPy 数组的数据类型。例如: ```python import numpy as np # 使用特定数据类型初始化单个数值 x = np.float32(1.0) # 初始化一个 float32 类型的标量 print(x) # 将列表转换为指定数据类型的数组 y = np.int_([1, 2, 4]) # 转换为默认整数类型 print(y) # 设置 dtype 参数来控制数组元素类型 z = np.arange(3, dtype=np.uint8) # 创建 uint8 类型的数组 print(z) ``` 上述代码展示了如何通过显式声明或隐式推断的方式设定数组的数据类型。 #### 官方文档与学习资源 官方文档是深入了解 NumPy 功能的最佳途径。可以从以下链接访问相关内容: - **NumPy 官网**: https://numpy.org/doc/ - **数据类型章节**: https://numpy.org/doc/stable/user/basics.types.html 此外,还可以参考社区教程和其他权威资料进一步巩固理解[^4]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值