NumPy之:数据类型对象dtype
简介
之前讲到了NumPy中有多种数据类型,每种数据类型都是一个dtype(numpy.dtype )对象。今天我们来详细讲解一下dtype对象。
dtype的定义
先看下dtype方法的定义:
class numpy.dtype(obj, align=False, copy=False)
其作用就是将对象obj转成dtype类型的对象。
它带了两个可选的参数:
align - 是否按照C编译器的结构体输出格式对齐对象。
Copy - 是拷贝对象,还是对对象的引用。
dtype可以用来描述数据的类型(int,float,Python对象等),描述数据的大小,数据的字节顺序(小端或大端)等。
可转换为dtype的对象
可转换的obj对象可以有很多种类型,我们一一来进行讲解
dtype对象
如果obj对象本身就是一个dtype对象,那么可以进行无缝转换。
None
不传的话,默认就是float_
,这也是为什么我们创建数组默认都是float类型的原因。
数组标量类型
内置的数组标量可以被转换成为相关的data-type对象。
前面一篇文章我们讲到了什么是数组标量类型。数组标量类型是可以通过np.type来访问的数据类型。 比如:
np.int32
,np.complex128
等。
我们看下数组标量的转换:
In [85]: np.dtype(np.int32)
Out[85]: dtype('int32')
In [86]: np.dtype(np.complex128)
Out[86]: dtype('complex128')
这些以np开头的内置数组标量类型可以参考我之前写的文章 “NumPy之:数据类型” 。
注意,数组标量并不是dtype对象,虽然很多情况下,可以在需要使用dtype对象的时候都可以使用数组标量。
通用类型
一些通用类型对象,可以被转换成为相应的dtype类型:
通用类型对象 | dtype类型 |
---|---|
number , inexact , floating |
float |
complexfloating |
cfloat |
integer , signedinteger |
int_ |
unsignedinteger |
uint |
character |
string |
generic , flexible |
void |
内置Python类型
一些Python内置的类型和数组标量类型是等价的,也可以被转换成为dtype:
Python类型 | dtype类型 |
---|---|
int | int_ |
bool | bool_ |
float | float_ |
complex | cfloat |
bytes | bytes_ |
str | str_ |
buffer | void |
(all others) | object_ |
看下内置Python类型转换的例子:
In [82]: np.dtype(float)
Out[82]: dtype('float64')
In [83]: np.dtype(int)
Out[83]: dtype('int64')
In [84]: np.dtype(object)
Out[84]: dtype('O')
带有.dtype属性的对象
任何type对象只要包含dtype
属性,并且这个属性属于可以转换的范围的话,都可以被转换成为dtype。
一个字符的string对象
对于每个内置的数据类型来说都有一个和它对应的字符编码,我们也可以使用这些字符编码来进行转换:
In [134]: np.dtype('b') # byte, native byte order
Out[134]: dtype('int8')
In [135]: np.dtype('>H') # big-endian unsigned short
Out[135]: dtype('>u2')
In [136]: np.dtype('<f') # little-endian single-precision float
Out[136]: dtype('float32')
In [137]: np.dtype('d') # double-precision floating-point number
Out[137]: dtype('float64')
数组类型的String
Numpy中数组类型的对象有一个属性叫做typestr。
typestr描述了这个数组中存放的数据类型和长度。
typestr由三部分组成,第一部分是描述数据字节顺序: <
小端 >
大端。
第二部分是数组里面元素的基本类型:
类型 | 描述 |
---|---|
t |
Bit field (following integer gives the number of bits in the bit field). |
b |
Boolean (integer type where all values are only True or False) |
i |
Integer |
u |
Unsigned integer |
f |
Floating point |
c |
Complex floating point |
m |
Timedelta |
M |
Datetime |
O |
Object (i.e. the memory contains a pointer to PyObject) |
S |
String (fixed-length sequence of char) |
U |
Unicode (fixed-length sequence of Py_UNICODE) |
V |
Other (void * – each item is a fixed-size chunk of memory) |
最后一部分就是数据的长度。
dtype支持下面几种类型的转换:
类型 | 描述 |
---|---|
'?' |
boolean |
'b' |
(signed) byte |
'B' |
unsigned byte |
'i' |
(signed) integer |
'u' |
unsigned integer |
'f' |
floating-point |
'c' |
complex-floating point |
'm' |
timedelta |
'M' |
datetime |
'O' |
(Python) objects |
'S' , 'a' |
zero-terminated bytes (not recommended) |
'U' |
Unicode string |
'V' |
raw data (void ) |
我们看几个例子:
In [137]: np.dtype('d')
Out[137]: dtype('float64')
In [138]: np.dtype('i4')
Out[138]: dtype('int32')
In [139]: np.dtype('f8')
Out[139]: dtype('float64')
In [140]: np.dtype('c16')
Out[140]: dtype('complex128')
In [141]: np.dtype('a25')
Out[141]: dtype('S25')
In [142]: np.dtype('U25')
Out[142]: dtype('<U25')
逗号分割的字符串
逗号分割的字符串可以用来表示结构化的数据类型。
对于这种结构化的数据类型也可以转换成为dtpye格式,转换后的dtype,将会以f1,f2, … fn-1作为名字来保存对应的格式数据。我们举个例子:
In [143]: np.dtype("i4, (2,3)f8, f4")
Out[143]: dtype([('f0', '<i4'), ('f1', '<f8', (2, 3)), ('f2', '<f4')])
上面的例子中,f0保存的是32位的整数,f1保存的是 2 x 3 数组的64-bit 浮点数。f2是一个32-bit 的浮点数。
再看另外一个例子:
In [144]: np.dtype("a3, 3u8, (3,4)a10")
Out[144]: dtype([('f0', 'S3'), ('f1', '<u8', (3,)), ('f2', 'S10', (3, 4))])
类型字符串
所有在numpy.sctypeDict
.keys()中的字符,都可以被转换为dtype:
In [146]: np.sctypeDict.keys()
Out[146]: dict_keys(['?', 0, 'byte', 'b', 1, 'ubyte', 'B', 2, 'short', 'h', 3, 'ushort', 'H', 4, 'i', 5, 'uint', 'I', 6, 'intp', 'p', 7, 'uintp', 'P', 8, 'long', 'l', 'L', 'longlong', 'q', 9, 'ulonglong', 'Q', 10, 'half', 'e', 23, 'f', 11, 'double', 'd', 12, 'longdouble', 'g', 13, 'cfloat', 'F', 14, 'cdouble', 'D', 15, 'clongdouble', 'G', 16, 'O', 17, 'S', 18, 'unicode', 'U', 19, 'void', 'V', 20, 'M', 21, 'm', 22, 'bool8', 'Bool', 'b1', 'float16', 'Float16', 'f2', 'float32', 'Float32', 'f4', 'float64', 'Float64', 'f8', 'float128', 'Float128', 'f16', 'complex64', 'Complex32', 'c8', 'complex128', 'Complex64', 'c16', 'complex256', 'Complex128', 'c32', 'object0', 'Object0', 'bytes0', 'Bytes0', 'str0', 'Str0', 'void0', 'Void0', 'datetime64', 'Datetime64', 'M8', 'timedelta64', 'Timedelta64', 'm8', 'int64', 'uint64', 'Int64', 'UInt64', 'i8', 'u8', 'int32', 'uint32', 'Int32', 'UInt32', 'i4', 'u4', 'int16', 'uint16', 'Int16', 'UInt16', 'i2', 'u2', 'int8', 'uint8', 'Int8', 'UInt8', 'i1', 'u1', 'complex_', 'int0', 'uint0', 'single', 'csingle', 'singlecomplex', 'float_', 'intc', 'uintc', 'int_', 'longfloat', 'clongfloat', 'longcomplex', 'bool_', 'unicode_', 'object_', 'bytes_', 'str_', 'string_', 'int', 'float', 'complex', 'bool', 'object', 'str', 'bytes', 'a'])
使用的例子:
In [147]: np.dtype('uint32')
Out[147]: dtype('uint32')
In [148]: np.dtype('float64')
Out[148]: dtype('float64')
元组
通过使用dtype构成的元组,我们可以生成新的dtype。
元组也有很多种方式。
(flexible_dtype, itemsize)
对于不固定长度的dtype,可以指定size:
In [149]: np.dtype((np.void, 10))
Out[149]: dtype('V10')
In [150]: np.dtype(('U', 10))
Out[150]: dtype('<U10')
(fixed_dtype, shape)
对于固定长度的dtype,可以指定shape:
In [151]: np.dtype((np.int32, (2,2)))
Out[151]: dtype(('<i4', (2, 2)))
In [152]: np.dtype(('i4, (2,3)f8, f4', (2,3)))
Out[152]: dtype(([('f0', '<i4'), ('f1', '<f8', (2, 3)), ('f2', '<f4')], (2, 3)))
[(field_name, field_dtype, field_shape), ...]
list中的元素是一个个的field,每个field都是由2-3个部分组成的,分别是field名字,field类型,field的shape。
field_name如果是 ’ ‘的话,就会使用默认的f1,f2 ….作为名字。field_name 也可以是一个2元组,由title 和 name 组成。
field_dtype 就是field的dtype类型。
shape是一个可选字段,如果field_dtype是一个数组的话,就需要指定shape。
In [153]: np.dtype([('big', '>i4'), ('little', '<i4')])
Out[153]: dtype([('big', '>i4'), ('little', '<i4')])
上面是两个字段,一个是大端的32位的int,一个是小端的32位的int。
In [154]: np.dtype([('R','u1'), ('G','u1'), ('B','u1'), ('A','u1')])
Out[154]: dtype([('R', 'u1'), ('G', 'u1'), ('B', 'u1'), ('A', 'u1')])
四个字段,每个都是无符号整形。
{'names': ..., 'formats': ..., 'offsets': ..., 'titles': ..., 'itemsize': ...}
这种写法可以指定name列表和formats列表:
In [157]: np.dtype({'names': ['r','g','b','a'], 'formats': [np.uint8, np.uint8, np.uint8, np.uint8]})
Out[157]: dtype([('r', 'u1'), ('g', 'u1'), ('b', 'u1'), ('a', 'u1')])
offsets 指的是每个字段的byte offsets。titles 是字段的title,itemsize 是整个dtype的size。
In [158]: np.dtype({'names': ['r','b'], 'formats': ['u1', 'u1'],
...: 'offsets': [0, 2],
...: 'titles': ['Red pixel', 'Blue pixel']})
...:
Out[158]: dtype({'names':['r','b'], 'formats':['u1','u1'], 'offsets':[0,2], 'titles':['Red pixel','Blue pixel'], 'itemsize':3})
(base_dtype, new_dtype)
可以将基本的dtype类型转换为结构化的dtype类型:
In [159]: np.dtype((np.int32,{'real':(np.int16, 0),'imag':(np.int16, 2)}))
Out[159]: dtype([('real', '<i2'), ('imag', '<i2')])
32位的int转换成两个16位的int。
In [161]: np.dtype(('i4', [('r','u1'),('g','u1'),('b','u1'),('a','u1')]))
Out[161]: dtype([('r', 'u1'), ('g', 'u1'), ('b', 'u1'), ('a', 'u1')])
32位的int,转换成4个unsigned integers。
本文已收录于 http://www.flydean.com/04-python-numpy-datatype-obj/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
NumPy之:数据类型对象dtype的更多相关文章
- python numPy模块 与numpy里的数据类型、数据类型对象dtype
学习链接:http://www.runoob.com/numpy/numpy-tutorial.html 官方链接:https://numpy.org/devdocs/user/quickstart. ...
- Numpy | 03 数据类型
numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型. 下表列举了常用 NumPy 基本类型: 名称 描 ...
- 3.1Python数据处理篇之Numpy系列(一)---ndarray对象的属性与numpy的数据类型
目录 目录 (一)简单的数组创建 1.numpy的介绍: 2.numpy的数组对象ndarray: 3.np.array(list/tuple)创建数组: (二)ndarray对象的属性 1.五个常用 ...
- Numpy | 02 Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放同类型元素的多维数组. ndarr ...
- 【MongoDB】递归获取字段更新表达式,更新复杂数据类型对象
在实际更新Mongo对象时发现,原有的更新代码无法更新复杂的数据类型对象.恰好看到张占岭老师有对该方法做相关的改进,因此全抄了下来. 总的核心思想就是运用反射与递归,对对象属性一层一层挖掘下去,循环创 ...
- String类、 StringBuffer、基本数据类型对象包装类
一.概述 Sting s1 = "abc"; //s1是一个类类型变量,"abc"是一个对象. String s2 = new String(" ...
- 黑马程序员_Java基本数据类型对象包装类
基本数据类型对象包装类 byte Byte short Short int Integer long Long boolean Boolean float Float double Double ch ...
- Java面向对象 String 基本数据类型对象包装类
Java面向对象 String 知识概要: (1)String的用法详解 (2)基本数据类型对象包装类 String 顾名思义,该类主要是对字符串 ...
- 基本数据类型对象包装(Integer等)
基本数据类型 包装类 byte Byte short Short int Integer long Long boolean Boolean float ...
随机推荐
- RocketMQ基础概念剖析,并分析一下Producer的底层源码
由于篇幅原因,本次的源码分析只限于Producer侧的发送消息的核心逻辑,我会通过流程图.代码注释.文字讲解的方式来对源码进行解释,后续应该会专门开几篇文章来做源码分析. 这篇博客聊聊关于Rocket ...
- c++中深层复制(浅层复制运行错误)成功运行-----sample
下面随笔给出c++中深层复制(浅层复制运行错误)成功运行------sample. 浅层复制与深层复制 浅层复制 实现对象间数据元素的一一对应复制. 深层复制 当被复制的对象数据成员是指针类型时,不是 ...
- AJAX 相关参数详细说明
最近ajax的使用十分频繁,对其许多参数还不是很了解,特此总结. 通用写法 1 $.ajax({ 2 url: "http://www.hzhuti.com", //请求的url地 ...
- TestLink测试用例管理工具使用说明
TestLink使用说明 打开网页,登录账号:(这里的账号是已经注册过的,并且拥有admin权限,可以创建用户.当然也可以通过点击登录页面的"新用户注册"按钮进行注册,但是权限是g ...
- 14. vue源码入口+项目结构分析
一. vue源码 我们安装好vue以后, 如何了解vue的的代码结构, 从哪里下手呢? 1.1. vue源码入口 vue的入口是package.json 来分别看看是什么含义 dependences: ...
- 分布式session实现方式
一.背景 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理. 如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,N ...
- 1_JVM与Java体系结构
目录 JVM与Java体系结构 前言 架构师每天都在思考什么? 为什么要学习JVM Java vs C++ 推荐书籍 Java生态圈 字节码 多语言混合编程 Java发展的重大事件 虚拟机与Java虚 ...
- TensorFlow学习(2)
TensorFlow学习(2) 一.jupyter notebook的安装和使用 1. 什么是jupyter notebook jupyter notebook(http://jupyter.org/ ...
- 前端坑多:使用js模拟按键输入的踩坑记录
坑 一开始在Google搜索了一番,找到了用jQuery的方案,代码量很少,看起来很美好很不错,结果,根本没用-- 我反复试了这几个版本: var e = $.Event('keyup') e.key ...
- Min25筛求1-n内的素数和
1 //#include <bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include< ...