数据类型对象 (dtype

数据类型对象(的实例 numpy.dtype 类)描述如何解释与数组项对应的固定大小内存块中的字节。它描述了数据的以下方面:

  1. 数据类型(integer、float、python对象等)

  2. 数据大小(有多少字节 e.g. 整数)

  3. 数据的字节顺序 (little-endianbig-endian

  4. 如果数据类型为 structured data type ,其他数据类型的聚合,( e.g. ,描述由整数和浮点组成的数组项,

    1. 结构的“:term:fields

    2. 每种数据类型是什么 field

    3. 每个字段占用内存块的哪个部分。

  5. 如果数据类型是子数组,那么它的形状和数据类型是什么。

要描述标量数据的类型,有以下几种 built-in scalar types 以numpy表示整数、浮点数的各种精度, etc . 从数组中提取的项, e.g. 通过索引,将是一个python对象,其类型是与数组的数据类型关联的标量类型。

注意,标量类型不是 dtype 对象,即使在numpy中需要数据类型规范时可以使用它们来代替一个。

结构化数据类型是通过创建 field 包含其他数据类型。每个字段都有一个名称 accessed . 父数据类型的大小应足以包含其所有字段;父数据类型几乎总是基于 void 允许任意项大小的类型。结构化数据类型的字段中还可以包含嵌套的结构化子数组数据类型。

最后,数据类型可以描述本身是另一个数据类型的项数组的项。但是,这些子数组的大小必须是固定的。

如果使用描述子数组的数据类型创建数组,则在创建数组时,子数组的维度将附加到数组的形状。结构化类型字段中的子数组行为不同,请参见 现场访问 .

子数组始终具有C-连续内存布局。

例子

包含32位big-endian整数的简单数据类型:(请参见 指定和构造数据类型 施工细节)

>>> dt = np.dtype('>i4')
>>> dt.byteorder
'>'
>>> dt.itemsize
4
>>> dt.name
'int32'
>>> dt.type is np.int32
True

对应的数组标量类型为 int32 .

例子

一种结构化数据类型,包含16个字符串(在字段“name”中)和两个64位浮点数(在字段“grades”中)的子数组:

>>> dt = np.dtype([('name', np.unicode_, 16), ('grades', np.float64, (2,))])
>>> dt['name']
dtype('<U16')
>>> dt['grades']
dtype(('<f8', (2,)))

此数据类型数组的项包装在 array scalar 也有两个字段的类型:

>>> x = np.array([('Sarah', (8.0, 7.0)), ('John', (6.0, 7.0))], dtype=dt)
>>> x[1]
('John', [6., 7.])
>>> x[1]['grades']
array([6.,  7.])
>>> type(x[1])
<class 'numpy.void'>
>>> type(x[1]['grades'])
<class 'numpy.ndarray'>

指定和构造数据类型

每当numpy函数或方法中需要数据类型时, dtype 可以提供对象或可转换为对象的内容。这种转换是由 dtype 构造函数:

dtype 

属性

可以转换为数据类型对象的内容如下所述:

dtype 对象

按原样使用。

没有

默认数据类型: float_ .

数组标量类型

24内置 array scalar type objects 全部转换为关联的数据类型对象。对于他们的子类也是如此。

请注意,并非所有数据类型信息都可以随类型对象一起提供:例如, flexible 数据类型具有默认值 项目尺寸 为0,并且需要显式给定的大小才有用。

例子

>>> dt = np.dtype(np.int32)      # 32-bit integer
>>> dt = np.dtype(np.complex128) # 128-bit complex floating-point number
泛型类型

通用层次类型对象根据关联转换为相应的类型对象:

number, inexact, floating

float

complexfloating

cfloat

integer, signedinteger

int_

unsignedinteger

uint

character

string

generic, flexible

void

1.19 版后已移除: 不赞成这种泛型标量类型的转换。这是因为在诸如 arr.astype(dtype=np.floating) ,它将 float32 一组数组 float64 即使 float32 是的子类型 np.floating .

内置python类型

当用于生成 dtype 对象:

int

int_

bool

bool_

float

float_

complex

cfloat

bytes

bytes_

str

str_

buffer

void

(所有其他)

object_

注意 str 根据Python版本,引用以空结尾的字节或Unicode字符串。针对python 2和3的代码中 np.unicode_ 应用作字符串的数据类型。见 Note on string types .

例子

>>> dt = np.dtype(float)   # Python-compatible floating-point number
>>> dt = np.dtype(int)     # Python-compatible integer
>>> dt = np.dtype(object)  # Python object

注解

所有其他类型映射到 object_ 为了方便。代码应该期望这样的类型将来可以映射到一个特定的(新的)数据类型。

类型与 .dtype

任何带有 dtype 属性:该属性将被直接访问和使用。属性必须返回可转换为dtype对象的内容。

可以转换几种字符串。可识别的字符串可以用 '>' (big-endian'<' (little-endian'=' (硬件本机,默认),以指定字节顺序。

一个字符串

每个内置数据类型都有一个字符代码(更新后的数字类型代码),用于唯一标识它。

例子

>>> dt = np.dtype('b')  # byte, native byte order
>>> dt = np.dtype('>H') # big-endian unsigned short
>>> dt = np.dtype('<f') # little-endian single-precision float
>>> dt = np.dtype('d')  # double-precision floating-point number
数组协议类型字符串(请参见 数组接口

第一个字符指定数据的类型,其余字符指定每个项目的字节数,Unicode除外,在Unicode中,它被解释为字符数。项大小必须与现有类型对应,否则将引发错误。支持的类型有

'?'

布尔

'b'

(符号)字节

'B'

无符号字节

'i'

(有符号)整数

'u'

无符号整数

'f'

浮点

'c'

复杂浮点

'm'

时间增量

'M'

日期时间

'O'

(python)对象

'S', 'a'

以零结尾的字节(不推荐)

'U'

Unicode字符串

'V'

原始数据 (void

例子

>>> dt = np.dtype('i4')   # 32-bit signed integer
>>> dt = np.dtype('f8')   # 64-bit floating-point number
>>> dt = np.dtype('c16')  # 128-bit complex floating-point number
>>> dt = np.dtype('a25')  # 25-length zero-terminated bytes
>>> dt = np.dtype('U25')  # 25-character string

关于字符串类型的说明

为了向后兼容python 2, Sa 类型字符串保留以零结尾的字节,并且 numpy.string_ 继续使用别名 numpy.bytes_ . 要在python 3中使用实际字符串,请使用 Unumpy.str_ . 对于不需要零终止的有符号字节 bi1 可以使用。

带逗号分隔字段的字符串

用于指定结构化数据类型格式的简短符号是基本格式的逗号分隔字符串。

此上下文中的基本格式是可选的形状说明符,后跟数组协议类型字符串。如果形状有多个维度,则需要在形状上使用括号。numpy允许对格式进行修改,即可以唯一标识类型的任何字符串都可以用于指定字段中的数据类型。生成的数据类型字段命名为 'f0''f1''f<N-1>' 其中n(>1)是字符串中逗号分隔的基本格式数。如果提供了可选的形状说明符,则对应字段的数据类型将描述子数组。

例子

  • 字段名 f0 包含32位整数

  • 字段名 f1 包含64位浮点数的2 x 3子数组

  • 字段名 f2 包含32位浮点数

>>> dt = np.dtype("i4, (2,3)f8, f4")
  • 字段名 f0 包含3个字符的字符串

  • 字段名 f1 包含包含64位无符号整数的形状(3,图1)的子数组

  • 字段名 f2 包含包含10个字符串的3 x 4子数组

>>> dt = np.dtype("a3, 3u8, (3,4)a10")
类型字符串

任何字符串 numpy.sctypeDict 键():

例子

>>> dt = np.dtype('uint32')   # 32-bit unsigned integer
>>> dt = np.dtype('float64')  # 64-bit floating-point number
(flexible_dtype, itemsize)

第一个参数必须是转换为零大小的灵活数据类型对象的对象,第二个参数是提供所需项大小的整数。

例子

>>> dt = np.dtype((np.void, 10))  # 10-byte wide data block
>>> dt = np.dtype(('U', 10))   # 10-character unicode string
(fixed_dtype, shape)

第一个参数是可以转换为固定大小数据类型对象的任何对象。第二个参数是此类型所需的形状。如果shape参数为1,则数据类型对象过去等同于固定的数据类型。自NUMPY1.17以来,这种行为已被弃用,将来会出现错误。如果 形状 是一个元组,然后新的dtype定义给定形状的子数组。

例子

>>> dt = np.dtype((np.int32, (2,2)))          # 2 x 2 integer sub-array
>>> dt = np.dtype(('i4, (2,3)f8, f4', (2,3))) # 2 x 3 structured sub-array
[(field_name, field_dtype, field_shape), ...]

obj 应该是字段列表,其中每个字段由长度为2或3的元组描述。(相当于 descr 项目中 __array_interface__ 属性。

第一个元素, field_name ,是字段名(如果是 '' 然后是标准字段名, 'f#' ,已分配)。字段名也可以是两组字符串,其中第一个字符串是“标题”(可以是任何字符串或Unicode字符串)或字段的元数据(可以是任何对象),第二个字符串是“名称”,必须是有效的python标识符。

第二个元素, field_dtype ,可以是任何可以解释为数据类型的内容。

可选的第三个元素 field_shape 如果此字段表示第二个元素中数据类型的数组,则包含该形状。注意,第三个参数等于1的三元组等价于二元组。

这种样式不接受 排列dtype 构造函数,因为它假定所有内存都由数组接口描述负责。

例子

带字段的数据类型 big (big endian 32位整数)和 little (小尾数32位整数):

>>> dt = np.dtype([('big', '>i4'), ('little', '<i4')])

带字段的数据类型 RGBA ,每个都是无符号8位整数:

>>> dt = np.dtype([('R','u1'), ('G','u1'), ('B','u1'), ('A','u1')])
{'names': ..., 'formats': ..., 'offsets': ..., 'titles': ..., 'itemsize': ...}

此样式有两个必需键和三个可选键。这个 姓名格式 需要钥匙。它们各自的值是具有字段名称和字段格式的等长列表。字段名必须是字符串,字段格式可以是 dtype 建造师。

当可选键 偏移量标题 它们的值都必须是与 姓名格式 列表。这个 偏移量 值是字节偏移量列表(限于 ctypes.c_int )对于每个字段,而 标题 值是每个字段的标题列表 (None 如果该字段不需要标题,则可以使用)。这个 标题 当一个物体 str 对象将向字段字典添加另一个条目,该字段字典由标题键控,并引用同一字段元组,该字段元组将包含作为附加元组成员的标题。

这个 项目尺寸 键允许设置数据类型的总大小,并且必须是一个足够大的整数,以便所有字段都在数据类型中。如果正在构造的数据类型是对齐的,则 项目尺寸 也必须可被结构对齐分割。总类型 项目尺寸 限于 ctypes.c_int .

例子

带字段的数据类型 rgba ,每个都是8位无符号整数:

>>> dt = np.dtype({'names': ['r','g','b','a'],
...                'formats': [np.uint8, np.uint8, np.uint8, np.uint8]})

带字段的数据类型 rb (具有给定标题),均为8位无符号整数,第一个位于字段开头的字节位置0处,第二个位于位置2处:

>>> dt = np.dtype({'names': ['r','b'], 'formats': ['u1', 'u1'],
...                'offsets': [0, 2],
...                'titles': ['Red pixel', 'Blue pixel']})
{'field1': ..., 'field2': ..., ...}

不鼓励使用这种方法,因为它与其他基于dict的构造方法不明确。如果有一个名为“name”的字段和一个名为“formats”的字段,则会发生冲突。

此样式允许传入 fields 数据类型对象的属性。

obj 应包含引用 (data-type, offset)(data-type, offset, title) 元组。

例子

包含字段的数据类型 col1 (字节位置0处的10个字符串), col2 (字节位置10处的32位浮点),以及 col3 (字节位置14处的整数):

>>> dt = np.dtype({'col1': ('U10', 0), 'col2': (np.float32, 10),
...                'col3': (int, 14)})
(base_dtype, new_dtype)

在numpy 1.7及更高版本中,此表单允许 base_dtype 解释为结构化数据类型。使用此dtype创建的数组将具有基础dtype base_dtype 但是会有田地和旗帜从 new_dtype . 这对于创建自定义结构化数据类型很有用,如中所述 record arrays .

此窗体还可以指定具有重叠字段的结构数据类型,其功能与C中的“union”类型类似。但是,不鼓励使用此用法,并且首选union机制。

两个参数必须可转换为总大小相同的数据类型对象。

例子

32位整数,前两个字节通过字段解释为整数 real ,以及以下两个字节via字段 imag .

>>> dt = np.dtype((np.int32,{'real':(np.int16, 0),'imag':(np.int16, 2)}))

32位整数,解释为由形状的子数组组成 (4,) 包含8位整数:

>>> dt = np.dtype((np.int32, (np.int8, 4)))

32位整数,包含字段 rgba 将整数中的4个字节解释为四个无符号整数:

>>> dt = np.dtype(('i4', [('r','u1'),('g','u1'),('b','u1'),('a','u1')]))

dtype

numpy数据类型描述是 dtype 班级。

属性

数据类型描述如下 dtype 属性:

dtype.type 

dtype.kind 

标识一般数据类型的字符代码(biufcmosv的一种)。

dtype.char 

为21种不同的内置类型中的每一种提供唯一的字符代码。

dtype.num 

为21种不同的内置类型中的每一种提供唯一的编号。

dtype.str 

此数据类型对象的数组协议类型字符串。

数据的大小依次由以下内容描述:

dtype.name 

此数据类型的位宽度名称。

dtype.itemsize 

此数据类型对象的元素大小。

此数据的结束地址:

dtype.byteorder 

指示此数据类型对象的字节顺序的字符。

有关a中的子数据类型的信息 structured data type

dtype.fields 

为此数据类型定义的命名字段的字典,或 None .

dtype.names 

字段名称的有序列表,或 None 如果没有字段。

对于描述子数组的数据类型:

dtype.subdtype 

元组 (item_dtype, shape) 如果这样 dtype 描述子数组,否则不描述。

dtype.shape 

如果此数据类型描述子数组,则为子数组的形状元组,并且 () 否则。

提供附加信息的属性:

dtype.hasobject 

布尔值,指示此数据类型是否在任何字段或子数据类型中包含任何引用计数的对象。

dtype.flags 

描述如何解释此数据类型的位标志。

dtype.isbuiltin 

整数,指示此数据类型与内置数据类型的关系。

dtype.isnative 

布尔值,指示此数据类型的字节顺序是否是平台本身的。

dtype.descr 

__array_interface__ 数据类型的描述。

dtype.alignment 

根据编译器,此数据类型所需的对齐方式(字节)。

dtype.base 

返回子数组的基元素的数据类型,无论其大小或形状如何。

用户附加的元数据:

dtype.metadata 

要么 None 或只读元数据字典(mappingproxy)。

方法

数据类型具有以下更改字节顺序的方法:

dtype.newbyteorder \ [new_order] )

返回具有不同字节顺序的新数据类型。

以下方法实现了pickle协议:

dtype.__reduce__ 

泡菜助手。

dtype.__setstate__