一、数据类型对象

numpy.dtype 类的实例用来描述数组项的组成形式。包括内存块字节数、数据类型等等。

在 NumPy 中描述标量数据的类型,有整数、浮点数等不同精度的几个内置标量类型。这些标量类型不是 dtype 类的实例,但是在需要使用 dtype 对象的地方,也可以使用这些标量。
结构化数据类型则是通过创建字段(包含其它数据类型的数据类型)类形成。每个字段都有一个名称,可以用来访问该字段。

数据类型对象描述了以下几个方面:

  1. 数据的类型(整型、浮点型、Python对象等);
  2. 数据的大小(多少个字节);
  3. 数据的顺序(little-endian or big-endian);
  4. 如果数据类型是子数组,它的形状和数据类型是什么;
  5. 如果数据类型对象是结构化数据类型,则是其它数据类型的集合;集合的每个元素包括(字段名称、字段数据类型,每个字段占用内存块的哪个部分);

二、numpy.dtype 类

1. numpy.dtype(dtype, align=False, copy=False)

用于创建一个数据类型对象。NumPy 数组的元素是由dtype描述的。数据类型对象可以由基本数字类型的不同组合构成。

2. 类的参数

  1. dtype: 要转换为的数据类型对象;
  2. align:bool, optional,如果为 true,填充字段使其类似 C 的结构体;
  3. copy:bool,optional,复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用;

3. 类的属性

  1. alignment:根据编译器此数据类型所需的对齐(字节);
  2. base:返回基本元素的数据类型;
  3. byteorder:指定此数据类型对象字节顺序的字符,<小端,>大端,|不适;
  4. char:21种不同内置类型中的每一种的唯一字符代码;
  5. descr:PEP3118接口描述了数据类型;
  6. fields:此数据类型定义命名字段字典;
  7. itemsize:此数据类型对象的元素大小;
  8. kind:此数据类型的字符代码;
  9. name:数据类型名称;
  10. name:字段名称组成的元组;
  11. str:此数据类型对象的数组协议类型字符串;

三、dtype数据类型对象构造

每当在 NumPy 函数或方法中需要数据类型时,需要提供 dtype 对象或可以转换为 dtype 的对象。
数据类型对象的转换由dtype构造函数完成,可以转换为数据类型对象的内容有:

1. dtype 对象

按原样使用.

2. None

使用默认的数据类型 float_.

3. Array-scalar 类型:

24钟内置数组标量类型对象,都转换为关联的 dtype 对象;

示例:

# 包含 32 位 big-endia 整数的简单的数据类型。
>>>dt = np.dtype(np.int32)
>dtype('int32')

>>>dt = np.dtype(np.complex128)
>dtype('complex128')

4. 泛型类型

泛型分层类型对象根据关联转换为相应的类型对象:
数组数据类型的类型对象的层次结构

类型类型
number, inexact, floatingfloat
complexfloatingcfloat
integer, signedintegerint_
unsignedintegeruint
characterstring
generic, flexiblevoid

5. 内置Python类型

Python内置类型在用于生成dtype对象时,等效于对应的数组标量类型:

类型类型
intint_
boolbool_
floatfloat_
complexcfloat
bytesbytes_
strunicode_
unicodeunicode_
buffervoid
all othersobject_

示例:

# 内置数据类型转换。
>>>dt = np.dtype(float)
>dtype('float64')

>>>dt = np.dtype(int)
>dtype('int32')

6. 带有 .dtype的类型

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

7.单字符串(One-character strings)

每个内置数据类型都有一个字符代码,用于唯一的标识,参考《NumPy中的24种不同类型的标量》
示例:

# 使用字符代码定义数据类型对象。
>>>dt = np.dtype('?')
>dtype('bool')
>
>>>dt = np.dtype('>H')
>dtype('>u2')

8. Array-protocol类型字符串

格式说明:第一个字符用于指定数据的类型,后面的字符用于指定每个项目的字节数,如果第一个字符指定的是Unicode,则后面的字符标识字符数。
字符代码与指代的类型:

代码类型
‘?’boolean
‘b’signed byte
‘B’unsigned byte
isigned intege
‘u’unsigned integer
‘f’floating-point
‘c’complex-floating point
‘m’timedelta
‘M’datetime
‘O’Python objects
‘S’, ‘a’zero-terminated bytes
‘U’Unicode string
‘V’raw data (void)

示例:

>>>dt = np.dtype('i4')
>dtype('int32')
>
>>>dt = np.dtype('c16')
>dtype('complex128')

>>>dt = np.dtype('a25')
>dtype('S25')

9. 带有逗号分隔字段的字符串

用于指定格式化数据类型的简写表示法,生成的数据类型的字段命名为 ‘f0’、‘f1’、···、‘fN’ 。
示例:

# 如果字段的形状需要多个维度,则需要写在数据类型前并在形状上加括号。
>>>dt = np.dtype("a3, 3u8, (2,4)U10")
>dtype([('f0', 'S3'), ('f1', '<u8', (3,)), ('f2', '<U10', (2, 4))])

10. 类型字符串

可以使用 numpy.sctypeDict.keys() 中包含的任何字符串来生成数据类型对象。
示例:

>>>dt = np.dtype("uint32")
>dtype('uint')

11. 使用(flexible_dtype, itemsize)格式设定灵活数据类型

(flexible_dtype, itemsize)

  • flexible_dtype:灵活数据类型对象;
  • itemsize:所需项大小的整数
    示例:
>>>dt = np.dtype("uint32")
>dtype('V10')

>>>dt = np.dtype(('U', 10))
>dtype('<U10')

12. 使用(fixed_dtype, shape)格式为固定大小的数据类型设定形状

(fixed_dtype, shape)

  • fixed_dtype:固定大小的数据类型;
  • shape:为整数,表示对应大小的一维数组;为元组,表示对应形状的子数组;
    示例:
>>>dt = np.dtype(('i8', 3))
>dtype(('<i8', (3,)))

>>>dt = np.dtype(('i4, (2,3)f8, f4', (2,3)))
>dtype(([('f0', '<i4'), ('f1', '<f8', (2, 3)), ('f2', '<f4')], (2, 3)))

13. 使用[(field_name, field_dtype, field_shape), ...]格式

[(field_name, field_dtype, field_shape), ...]

  • field_name:字段名称;
  • field_dtype:数据类型;
  • field_shape:数组形状;
    示例:
>>>dt = np.dtype([('big', '>i4'), ('little', '<i4')])
>dtype([('big', '>i4'), ('little', '<i4')])

14. 使用{'names': ..., 'formats': ..., 'offsets': ..., 'titles': ..., 'itemsize': ...}格式

{'names': ..., 'formats': ..., 'offsets': ..., 'titles': ..., 'itemsize': ...}

  • names:必选,字段名称列表;
  • formats:必选,数据类型列表,必须与字段名称列表等长;
  • offsets:可选,每个字段的字节偏移量的列表
  • titles:可选,标题列表;
  • itemsize:可选,设置dtype的总大小;
    示例:
>>>dt = np.dtype({'names': ['r','b'], 'formats': ['u1', 'u1'],
                'offsets': [0, 2],
               'titles': ['Red pixel', 'Blue pixel']})
>dtype({'names':['r','b'], 'formats':['u1','u1'], 'offsets':[0,2], 'titles':['Red pixel','Blue pixel'], 'itemsize':3})

15. 使用{'field1': ..., 'field2': ..., ...}格式

{'field1': ..., 'field2': ..., ...}
示例:

>>>dt = np.dtype({'col1': ('U10', 0), 'col2': (np.float32, 10),
    'col3': (int, 14)})
>dtype({'names':['col1','col2','col3'], 'formats':['<U10','<f4','<i4'], 'offsets':[0,10,14], 'itemsize':40})

16. 使用(base_dtype, new_dtype)格式

这种方法是将 base_dtype 解释为结构化的dtype。
示例:

# 将32位整数解释位两个16位整数
>>>dt = np.dtype((np.int32,{'real':(np.int16, 0),'imag':(np.int16, 2)}))
>dtype((numpy.int32, [('real', '<i2'), ('imag', '<i2')]))

# 将32位整数解释为包含8位整数的子数组
>>>dt = np.dtype((np.int32, (np.int8, 4)))
>dtype('int32')
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐