python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > NumPy数据类型对象(dtype)构造

NumPy数据类型对象(dtype)的构造方式

作者:峡谷的小鱼

这段文章详细介绍了NumPy中的`numpy.dtype`类及其应用用,涵盖数据类型对象的创建、属性及用示例,关键点包括:`numpy.dtype`类、数据类型对象、示例

一、数据类型对象

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

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

二、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)

示例:

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

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

12. 使用(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), ...]

示例:

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

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

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

示例:

>>>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')

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文