用户:Xyy23330121/Python/科学计算/数组的数据类型


在创建数组时,使用 dtype 参数,可以让数组中的数字使用特定的数据类型。比如:

import numpy as np

x = np.ones(2, dtype=float) #形状为(2, )的全一数组,使用 Python 的 float 类型。

一切 Python 的数据类型都可以用于数组中,如果读者希望,也可以 from decimal import Decimal 然后设置数据类型为 Decimal。对于 Python 其它模块的数据类型不再赘述。以下将详细讲述 numpy 的数据类型。若无特殊说明,之后所有代码均以下面代码为开头。

import numpy as np

numpy 的内置数据类型

编辑

numpy 内置了许多数据类型。本节所述的类型都可以作为数据存放在数组中。

numpy 中的一切数字类型都以 np.number 为抽象基类。若需要判断数据是否是 numpy 的数字类型,而不关注数字具体的存储方式,可以使用 np.number 来进行判断。

numpy的整数类型
占用的
字节数
有符号整数 无符号整数
类型名称 类型别名 类型名称 类型别名
1 np.byte np.int8 np.ubyte np.uint8
2 np.short np.int16 np.ushort np.uint16
4 np.intc np.int32 np.uintc np.uint32
8 np.long np.int64
np.intp
np.ulong np.uint64
np.uintp
16 np.longlong np.ulonglong
特殊 np.int_ 在32位系统占用4字节,
在64位系统占用8字节。
np.uint 在32位系统占用4字节,
在64位系统占用8字节。

整数

编辑

numpy 的整数类型与 Python 内置整数类型不同,它有字节限制,因此它所存储的数值具有上下限。所有整数类型有一个抽象基类 np.integer。有符号整数额外有抽象基类 np.signedinteger,而无符号整数则具有 np.unsignedinteger 作为抽象基类。

特别的,numpy 的数组中是无法使用 Python 内置的整数类型的。numpy 的默认整数类型为 np.int64,当设置 dtype=int 时,numpy 会擅自将其类型设置为 int64

numpy 的浮点数类型
占用的
字节数
浮点数 复数
类型名称 类型别名 类型名称 类型别名
2 np.half np.float16
4 np.single np.float32
8 np.double np.float64 np.csingle np.complex64
16 np.longdouble np.float128 np.cdouble np.complex128
32 np.clongdouble np.complex256

非精确数字/浮点数

编辑

numpy 还内置了许多浮点数类型。与整数相似,numpy 也给浮点数设置了一些抽象基类:

  • np.inexact 一切可能存在误差的数字类型基类
  • np.floating 一切浮点数的数字类型基类
  • np.complexfloating 一切复数(由两个浮点数组成)的数字类型基类

特别的,np.float64 和 Python 内置的 float 类型是同一个类型,这也是 numpy 在遇到浮点数时的默认类型。np.complex128 和 Python 内置的 complex 类型是同一个类型。

注:实际上,np.longdouble 和 np.float128 等高精度浮点数类型可能并不会具有更高精度——而是和 np.float64 具有相同的精度,具体参见 Stack Overflow 上面的 这个讨论

布尔值

编辑

numpy 使用 np.bool 类型(别名 np.bool_)来存储布尔值。与 Python 中 boolint 的子类型不同;np.boolnp.int_ 的子类型。

对于 numpy 提供的其它数据类型,可以参见:

时间数据类型

编辑

类似 Python 的 datetime 模块,numpy 也有表示时间的数据类型 np.datetime64np.timedelta64。参见: https://numpy.org/doc/stable/reference/arrays.datetime.html#arrays-datetime

字符串和字节串

编辑

numpy 使用np.str_ 作为字符串类型,使用 np.bytes_ 作为字节串类型。这两个类型分别拥有 Python 内置类型 strbytes 的一切方法。除此之外,这两个类型有共同的抽象基类:

  • np.flexible 不定长数据的基类。np.ndarray也属于该基类。
  • np.character Abstract base class of all character string scalar types.

判断数据类型

编辑

除了用 isinstance() 函数判断数据类型之外,numpy 还为数组提供了一个属性 ndarray.dtype,用于判断数组内数据的类型。如下所示:

a = np.array([[1.1,2,3,4],[5,6,7,8]])
print(a.dtype)       #输出:float64
print(type(a.dtype)) #输出:<class 'numpy.dtypes.Float64DType'>
b = np.array([[1.1,2,3,4],[5,6,7,8]],dtype=int)
print(b.dtype)       #输出:int64

from decimal import Decimal as dec

c = np.array([[1.1,2,3,4],[5,6,7,8]],dtype=dec)
print(c.dtype)       #输出:object
print(type(c.dtype)) #输出:<class 'numpy.dtypes.ObjectDType'>

特别的,对于非 Python 内置类型,dtype 总会输出 object。

内存占用

编辑
查询内存占用时使用的属性
属性 备注
ndarray.flags Information about the memory layout of the array.
ndarray.shape 数组的形状。
ndarray.strides 遍历数组时,在每个维度需要步进的字节数。
ndarray.ndim 数组的维数。
ndarray.data 指向数组数据起点的 Python 缓冲对象。
ndarray.size 数组的数据个数。
ndarray.itemsize 数组中每个数据占用的内存(单位:字节)。
ndarray.nbytes 数组所占用的总内存(单位:字节)。
ndarray.base Base object if memory is from some other object.

numpy 提供了一些属性用于查看数组的内存占用。这些属性由右表所示。

其中,关于 ndarray.strides 我们有:

a = np.array([[1,2,3,4],[5,6,7,8]])
print(a.strides)   #输出:(32, 8)
print(a[0].nbytes) #输出:32
print(a.itemsize)  #输出:8


https://numpy.org/doc/stable/reference/arrays.scalars.html#attributes

https://numpy.org/doc/stable/reference/arrays.scalars.html#methods

自定义数据类型

编辑

读者也可以通过 numpy.dtype() 函数来创建自己的数据类型,参见:

更多内容

编辑

参见: