跳转到内容

User: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() 函数来创建自己的数据类型,参见:

更多内容

[编辑 | 编辑源代码]

参见: