数据类型对象(numpy.dtype
类的实例)描述了应如何解释与数组项相对应的固定大小的内存块中的字节。它描述了数据的以下方面:
数据类型(整数,浮点数,Python对象等)
数据大小(例如整数中有多少个字节)
数据的字节顺序(little-endian或big-endian)
如果数据类型是结构化数据类型,则为其他数据类型的集合(例如,描述由整数和浮点数组成的数组项),
如果数据类型是子数组,则其形状和数据类型是什么。
为了描述标量数据的类型,NumPy中有几种内置标量类型,用于整数,浮点数等各种精度。从数组中提取的一项(例如通过索引)将是一个Python对象,其类型是与数组的数据类型相关联的标量类型。
请注意,标量类型不是dtype
对象,即使在NumPy中需要数据类型规范时也可以代替使用标量类型。
通过创建其字段包含其他数据类型的数据类型来形成结构化
数据类型。每个字段都有一个可以访问的名称。父数据类型的大小应足以容纳其所有字段。父对象几乎总是基于void
允许任意项目大小的类型。结构化数据类型还可以在其字段中包含嵌套的结构化子数组数据类型。
最后,数据类型可以描述本身就是另一种数据类型的项目数组的项目。但是,这些子阵列的大小必须固定。
如果使用描述子数组的数据类型创建数组,则创建数组时,子数组的尺寸会附加到数组的形状上。结构化类型的字段中的子数组的行为不同,请参见Field Access。
子数组始终具有C连续的内存布局。
例
包含32位大端整数的简单数据类型:(有关构造的详细信息,请参阅指定和构造数据类型)
>>> dt = np.dtype('>i4')
>>> dt.byteorder
'>'
>>> dt.itemsize
4
>>> dt.name
'int32'
>>> dt.type is np.int32
True
对应的数组标量类型为int32
。
例
结构化数据类型,包含16个字符的字符串(在“名称”字段中)和两个64位浮点数的子数组(在“等级”字段中):
>>> dt = np.dtype([('name', np.unicode_, 16), ('grades', np.float64, (2,))])
>>> dt['name']
dtype('|U16')
>>> dt['grades']
dtype(('float64',(2,)))
此数据类型的数组的项目包装在也有两个字段的数组标量类型中:
>>> x = np.array([('Sarah', (8.0, 7.0)), ('John', (6.0, 7.0))], dtype=dt)
>>> x[1]
('John', [6.0, 7.0])
>>> x[1]['grades']
array([ 6., 7.])
>>> type(x[1])
<type 'numpy.void'>
>>> type(x[1]['grades'])
<type 'numpy.ndarray'>
每当NumPy函数或方法中需要数据类型时,都可以提供dtype
对象或可以转换为一个的对象。此类转换由dtype
构造函数完成:
|
创建一个数据类型对象。 |
下面描述了可以转换为数据类型对象的内容:
dtype
宾语
照原样使用。
没有
默认数据类型:
float_
。
数组标量类型
24个内置数组标量类型对象全部转换为关联的数据类型对象。他们的子类别也是如此。
请注意,并非所有数据类型信息都可以提供一个类型对象:例如,
flexible
数据类型的默认项目大小为0,并且需要显式指定的大小才有用。例
>>> dt = np.dtype(np.int32) # 32-bit integer >>> dt = np.dtype(np.complex128) # 128-bit complex floating-point number
通用类型
内置Python类型
当用于生成
dtype
对象时,几种python类型等效于对应的数组标量:
int_
bool_
float_
cfloat
bytes_
bytes_
(Python2)或unicode_
(Python3)
unicode
unicode_
buffer
void
(所有其他人)
object_
请注意,
str
根据Python版本的不同,它指的是空终止字节或unicode字符串。在针对Python的代码中,np.unicode_
应将Python 2和3 用作字符串的dtype。请参见有关字符串类型的注释。例
>>> dt = np.dtype(float) # Python-compatible floating-point number >>> dt = np.dtype(int) # Python-compatible integer >>> dt = np.dtype(object) # Python object
类型与 .dtype
具有
dtype
属性的任何类型的对象:将直接访问和使用该属性。该属性必须返回可转换为dtype对象的内容。
可以转换几种字符串。可以使用'>'
(big-endian),'<'
(little-endian)或'='
(hardware-native,默认值)前缀识别字符串,以指定字节顺序。
一字符字符串
每个内置数据类型都有一个字符代码(更新的Numeric类型代码),可以唯一地标识它。
例
>>> 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
数组协议类型的字符串(请参阅Array接口)
第一个字符指定数据的类型,其余字符指定每个项目的字节数,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向后兼容,
S
and和a
typestrings保留以零结尾的字节,并np.string_
继续映射到np.bytes_
。要在Python 3中使用实际的字符串,请使用U
或np.unicode_
。对于不需要零终止b
或i1
可以使用的有符号字节。
字符串,用逗号分隔
用于指定结构化数据类型的格式的简写形式是基本格式的逗号分隔字符串。
在这种情况下,基本格式是可选的形状说明符,后跟数组协议类型的字符串。如果形状具有多个尺寸,则需要在形状上加上括号。NumPy允许对格式进行修改,使得可以唯一标识类型的任何字符串都可以用于指定字段中的数据类型。生成的数据类型字段命名为
'f0'
,,'f1'
…,'f<N-1>'
其中N(> 1)是字符串中逗号分隔的基本格式的数量。如果提供了可选的形状说明符,则对应字段的数据类型将描述一个子数组。例
f0
包含32位整数的字段字段命名为
f1
含有64位浮点数的2×3子阵列
f2
包含32位浮点数的字段>>> dt = np.dtype("i4, (2,3)f8, f4")
f0
包含3个字符的字符串的字段名为
f1
包含形状为(3,)的子数组的字段,该数组包含64位无符号整数
f2
包含3个x 4子数组的字段,该子数组包含10个字符的字符串>>> dt = np.dtype("a3, 3u8, (3,4)a10")
输入字符串
numpy.sctypeDict
.keys()中的任何字符串:例
>>> 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,则数据类型对象等效于固定dtype。如果shape是一个元组,则新的dtype定义给定形状的子数组。
例
>>> dt = np.dtype((np.int32, (2,2))) # 2 x 2 integer sub-array >>> dt = np.dtype(('U10', 1)) # 10-character string >>> 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#'
,则被分配)。字段名称也可以是2个字符串的字符串,其中第一个字符串是“ title”(可以是任何字符串或unicode字符串)或该字段的元数据(可以是任何对象),第二个字符串是“名称”,必须是有效的Python标识符。第二个元素field_dtype可以是任何可以解释为数据类型的元素。
如果此字段表示第二个元素中的数据类型数组,则可选的第三个元素field_shape包含形状。请注意,第三个参数等于1的3元组等效于2个元组。
此样式在 构造函数中不接受align,
dtype
因为假定所有内存均由数组接口描述解决。例
具有字段
big
(big-endian 32位整数)和little
(little-endian 32位整数)字段的数据类型:>>> dt = np.dtype([('big', '>i4'), ('little', '<i4')])数据类型与字段
R
,G
,B
,A
,各为一个无符号的8位整数:>>> dt = np.dtype([('R','u1'), ('G','u1'), ('B','u1'), ('A','u1')])
{'names': ..., 'formats': ..., 'offsets': ..., 'titles': ..., 'itemsize': ...}
此样式具有两个必需键和三个可选键。该名称 和格式的密钥是必需的。它们各自的值是等长列表,其中包含字段名称和字段格式。字段名称必须是字符串,并且字段格式可以是
dtype
构造函数接受的任何对象。提供可选的键偏移量和标题时,它们的值都必须是与名称 和格式列表长度相同的列表。该偏移值是字节偏移(限于列表
ctypes.c_int
)对于每个字段,而标题值是标题的每个字段的列表(如果没有标题期望该字段被用于无)。的标题可以是任何string
或unicode
对象,并且将添加另一条目的字段字典由标题键和引用相同的字段的元组,其将包含标题作为附加元组构件。项目大小键允许设置dtype的总大小,并且必须是足够大的整数,以便所有字段都在dtype内。如果正在构造的dtype是对齐的,则itemsize也必须可以被struct对齐整除。dtype项的总 大小限制为
ctypes.c_int
。例
数据类型与字段
r
,g
,b
,a
,各为8位无符号整数:>>> dt = np.dtype({'names': ['r','g','b','a'], ... 'formats': [uint8, uint8, uint8, uint8]})具有字段
r
和b
(具有给定标题)的数据类型都是8位无符号整数,第一个位于字段开头的字节位置0,第二个位于位置2:>>> dt = np.dtype({'names': ['r','b'], 'formats': ['u1', 'u1'], ... 'offsets': [0, 2], ... 'titles': ['Red pixel', 'Blue pixel']})
{'field1': ..., 'field2': ..., ...}
不鼓励使用此方法,因为它与其他基于dict的构造方法不明确。如果您有一个名为“名称”的字段和一个名为“格式”的字段,则将发生冲突。
这种样式允许传入
fields
数据类型对象的属性。obj应该包含引用或元组的字符串或unicode键 。
(data-type, offset)
(data-type, offset, title)
例
数据类型包含字段
col1
(在字节位置0处的10个字符的字符串),col2
(在字节位置10处的32位浮点数)和col3
(在字节位置14的整数):>>> dt = np.dtype({'col1': ('U10', 0), 'col2': (float32, 10), 'col3': (int, 14)})
(base_dtype, new_dtype)
在NumPy 1.7和更高版本中,此格式允许base_dtype解释为结构化dtype。使用此dtype创建的数组将具有基础dtype base_dtype,但具有从new_dtype获取的字段和标志。这对于创建自定义结构化dtype很有用,就像在 record array中一样。
这种形式还可以指定具有重叠字段的struct dtype,其功能类似于C中的“ union”类型。但是不鼓励使用此方法,并且首选并集机制。
两个参数都必须可以转换为具有相同总大小的数据类型对象。
例
32位整数,其前两个字节被解释为经由场的整数
real
,并且经由字段下面两个字节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位整数,包含字段
r
,g
,b
,a
其解释在整数四个无符号整数的4个字节:>>> dt = np.dtype(('i4', [('r','u1'),('g','u1'),('b','u1'),('a','u1')]))
dtype
¶NumPy数据类型描述是dtype
该类的实例。
数据的类型由以下dtype
属性描述:
用于实例化此数据类型的标量的类型对象。 |
|
标识通用数据类型的字符代码(“ biufcmMOSUV”之一)。 |
|
21种内置类型中的每一种的唯一字符代码。 |
|
21种不同的内置类型中的每一个的唯一编号。 |
|
此数据类型对象的数组协议类型字符串。 |
数据大小依次由以下方式描述:
此数据类型的位宽名称。 |
|
此数据类型对象的元素大小。 |
此数据的字节序:
指示此数据类型对象的字节顺序的字符。 |
为此数据类型定义的命名字段的字典,或 |
|
字段名称的排序列表,或者 |
对于描述子数组的数据类型:
如果描述了子数组,则为元组,否则为None。 |
|
如果此数据类型描述了子数组,则为子数组的形状元组, |
提供其他信息的属性:
指示此dtype是否在任何字段或子dtypes中包含任何引用计数对象的布尔值。 |
|
位标记,描述如何解释此数据类型。 |
|
整数,指示此dtype与内置dtype的关系。 |
|
布尔值,指示此dtype的字节顺序是否是平台固有的。 |
|
__array_interface__数据类型的描述。 |
|
根据编译器,此数据类型的所需对齐方式(字节)。 |
|
不管子数组的尺寸或形状如何,都为子数组的基础元素返回dtype。 |