NumPy_dtype
NumPy
支持比 Python
更多种类的数值类型。 下表显示了 NumPy
中定义的不同标量数据类型。
序号 | 数据类型及描述 |
---|---|
bool | 存储为一个字节的布尔值(真或假) |
int | 默认整数,相当于 C 的long,通常为int32或int64 |
intc | 相当于 C 的int,通常为int32或int64 |
intp | intp用于索引的整数,相当于 C 的size_t,通常为int32或int64 |
int8 | 8字节(-128 ~ 127) |
int16 | 16 位整数(-32768 ~ 32767) |
int32 | 32 位整数(-2147483648 ~ 2147483647) |
int64 | 64 位整数(-9223372036854775808 ~ 9223372036854775807) |
uint8 | 8 位无符号整数(0 ~ 255) |
uint16 | 16 位无符号整数(0 ~ 65535) |
uint32 | 32 位无符号整数(0 ~ 4294967295) |
uint64 | 64 位无符号整数(0 ~ 18446744073709551615) |
float | float64的简写 |
float16 | float16半精度浮点:符号位,5 位指数,10 位尾数 |
float32 | float32单精度浮点:符号位,8 位指数,23 位尾数 |
float64 | float64双精度浮点:符号位,11 位指数,52 位尾数 |
complex | complex_complex128的简写 |
complex64 | complex64复数,由两个 32 位浮点表示(实部和虚部) |
complex128 | complex128复数,由两个 64 位浮点表示(实部和虚部) |
NumPy 数字类型是 dtype
(数据类型)对象的实例,每个对象具有唯一的特征。 这些类型可以是np.bool_
,np.float32
等。
数据类型对象 (dtype)
数据类型对象描述了对应于数组的固定内存块的解释,取决于以下方面:
- 数据类型(整数、浮点或者
Python
对象) - 数据大小
- 字节序(小端或大端)
- 在结构化类型的情况下,字段的名称,每个字段的数据类型,和每个字段占用的内存块部分。
- 如果数据类型是子序列,它的形状和数据类型。
字节顺序取决于数据类型的前缀 <
或 >
。<
意味着编码是小端(最小有效字节存储在最小地址中)。>
意味着编码是大端(最大有效字节存储在最小地址中)。
dtype可由一下语法构造:
numpy.dtype(object, align, copy)
参数为:
Object
: 被转换为数据类型的对象。Align
: 如果为true,则向字段添加间隔,使其类似C
的结构体。Copy
: 生成dtype
对象的新副本,如果为flase
,结果是内建数据类型对象
的引用。
示例 1
>>> import numpy as np
>>> dt = np.dtype(np.int32)
>>> dt
dtype('int32')
>>> dt = np.dtype('i4')
>>> dt
dtype('int32')
>>> dt = np.dtype('>i4')
>>> dt
dtype('>i4')
下面的例子展示了结构化数据类型的使用。 这里声明了字段名称和相应的标量数据类型。
示例 2
>>> import numpy as np
>>> dt = np.dtype([('age', np.int8)])
>>> dt
dtype([('age', 'i1')])
>>> a = np.array([(10,), (20, ), (30, )], dtype=dt)
>>> a
array([(10,), (20,), (30,)], dtype=[('age', 'i1')])
>>> student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
>>> student
dtype([('name', 'S20'), ('age', 'i1'), ('marks', '<f4')])
>>> a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
>>> a
array([(b'abc', 21, 50.), (b'xyz', 18, 75.)],
dtype=[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')])
每个内建类型都有一个唯一定义它的字符代码:
b
:布尔值i
:符号整数u
:无符号整数f
:浮点c
:复数浮点m
:时间间隔M
:日期时间O
:Python 对象S
,a
:字节串U
:UnicodeV
:原始数据(void
)
类型转换
既然Numpy
数组是静态类型,数组一旦生成类型就无法改变。但是我们可以显示地对某些元素数据类型进行转换生成新的数组,使用 astype
函数(可查看功能相似的 asarray
函数):
>>> M = np.array([[1, 4], [9, 16]], dtype=np.int32)
>>> M.dtype
dtype('int32')
>>> M.astype(float)
array([[ 1., 4.],
[ 9., 16.]])
>>> M.dtype
dtype('int32')
>>> M.astype(np.float)
array([[ 1., 4.],
[ 9., 16.]])
>>> M = M.astype(np.float)
>>> M.dtype
dtype('float64')
>>> M = M.astype(np.bool)
>>> M
array([[ True, True],
[ True, True]])
>>> M.dtype
dtype('bool')
在numpy
中,还有一系列以 as 开头的方法,它们可以将特定输入转换为数组,亦可将数组转换为矩阵、标量,ndarray
等。如下:
asarray(a,dtype,order)
:将特定输入转换为数组。asanyarray(a,dtype,order)
:将特定输入转换为ndarray
。asmatrix(data,dtype)
:将特定输入转换为矩阵。asfarray(a,dtype)
:将特定输入转换为float
类型的数组。asarray_chkfinite(a,dtype,order)
:将特定输入转换为数组,检查NaN
或infs
。asscalar(a)
:将大小为 1 的数组转换为标量。
这里以 asmatrix(data,dtype)
方法举例:
>>> a = np.arange(4).reshape(2,2)
>>> a
array([[0, 1],
[2, 3]])
>>> np.asmatrix(a)
matrix([[0, 1],
[2, 3]])