前面在介绍创建ndarray的一些方法中都需要指定dtype参数,其实它是numpy中的dtype类型,我们可以通过多种方式来指定dtype
>>> x = np.array([1,2,3,4,5,6],dtype=int) #可以指定python中的基本类型,如int
>>> x.dtype
dtype('int32')
>>> x = np.array([1,2,3,4,5,6],dtype=float) #可以指定python中的基本类型,如float
>>> x.dtype
dtype('float64')
>>> x = np.array([1,2,3,4,5,6],dtype=complex) #可以指定复数类型
>>> x.dtype
dtype('complex128') #128位复数类型,实部占64位,虚部占64位
>>> x
array([1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j])
以上是通过指定python中的基本类型创建ndarray的,也可通过numpy中的类型进行指定,如:
>>> x = np.array([1,2,3,4,5,6],dtype=np.int) # np.int指定
>>> x.dtype
dtype('int32')
>>> x = np.array([1,2,3,4,5,6],dtype=np.int16)
>>> x.dtype
dtype('int16')
>>> x = np.array([1,2,3,4,5,6],dtype=np.float)
>>> x.dtype
dtype('float64')
>>> x = np.array([1,2,3,4,5,6],dtype=np.float32)
>>> x.dtype
dtype('float32')
>>> x = np.array([1,2,3,4,5,6],dtype=np.float_) # numpy的float类型
>>> x.dtype
dtype('float64')
>>> x = np.array([1,2,3,4,5,6],dtype=np.complex64) #numpy可以指定64位复数类型,实部占32位,虚部占32位
>>> x
array([1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j], dtype=complex64)
>>> x.dtype
dtype('complex64')
numpy中的类型还可以在基本类型名称后加位数的,如np.int16表示16位整型(在内存在占16位二进制),python基本类型中并没有int+位数的这种形式,所以使用dtype=int16会报错,所以numpy强大,np.float与np.float_的区别如下:
>>> np.float_ # numpy中的float对象
<type 'numpy.float64'>
>>> np.float # 本质是python中的float类型
<type 'float'>
我们除了除了用python和numpy中的数据类型指定dtype参数,还可以使用字符串的形式指定dtype,如下示例:
>>> x = np.array([1,2,3,4,5,6],dtype='int')
>>> x.dtype
dtype('int32')
>>> x = np.array([1,2,3,4,5,6],dtype='int64') # 64位int类型,每个int占8个字节,我这是试验,实际应用中不要这么搞
>>> x.dtype
dtype('int64')
>>> x = np.array([1,2,3,4,5,6],dtype='float')
>>> x.dtype
dtype('float64')
>>> x = np.array([1,2,3,4,5,6],dtype='float32')
>>> x.dtype
dtype('float32')
>>> x = np.array([1,2,3,4,5,6],dtype='complex64') # 类型字符串指定64位复数
>>> x.dtype
dtype('complex64')
>>> x # 复数有一个虚部j
array([1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j], dtype=complex64)
使用字符串定义的dtype,可以使用基本类型名称[+位数],位数可选,如int或int32,float或float32或float64等。还可以指定64位复数类型,实部与虚部各占32位。
下面还有一种字符串形式指定dtype参数的,这个字符由3个部分组成,分别由 内存顺序+类型代码+类型所占内存字节数,如'>i4',i表示整形int,4表示4个字节即32位,>表示数据字节在内存中以大端形式存储(即字节顺序)。
>>> x = np.array([1,2,3,4,5,6],dtype='|i4')
>>> x.dtype
dtype('int32')
字节顺序
一个字符表示这个数据类型对象的字节顺序
这些其中之一:
'=' 本地
'<' 小端
'>' 大端
'|' 不适用
所有的内置类型对象要以是'=',要么是'|'。
b boolean
i signed integer
u unsigned integer
f floating-point
c complex floating-point
m timedelta
M datetime
O object
S (byte-)string
U Unicode
V void
其它类型参考地址:https://www.numpy.org/devdocs/reference/arrays.scalars.html#arrays-scalars-built-in
根据上面的字节顺序与字符代码,我们很容易创建一些dtype对象,下面我们创建一个由字符串组成的ndarray:
>>> x = np.array(['Java','Python','C#','JavaScript'],dtype='|S4')
>>> x
array(['Java', 'Pyth', 'C#', 'Java'], dtype='|S4')
>>> x.dtype
dtype('S4')
大家看上的JavaScript变成Java了,Python变成Pyth了,只保留了4个字符,这就是'|S4'类型的作用。
int np.int_
bool np.bool_
float np.float_
complex np.cfloat
bytes np.bytes_
str np.bytes_ (Python2) or np.unicode_ (Python3)
unicode np.unicode_
buffer np.void
(all others) np.object_
我们之前不管用什么方式指定,其实内部创建的都是numpy的dtype类的对象,我们也可以单独创建一个dtype类型对象,如下所示:
>>> dt = np.dtype(int) # 通过int创建dtype对象
>>> dt
dtype('int32')
>>> dt = np.dtype(np.float32) # 通过np.float32创建dtype对象
>>> dt
dtype('float32')
>>> dt = np.dtype('complex') # 通过'complex'创建dtype对象
>>> dt
dtype('complex128')
>>> dt = np.dtype('=i4') # 通过'=i4'创建dtype对象
>>> dt
dtype('int32')
我们之前创建ndarray方法中的dtype参数指定什么,就可以使用什么来创建dtype对象。
1.获取字节顺序:
>>> x = np.array([1,2,3,4,5,6],dtype='float32')
>>> x.dtype
dtype('float32')
>>> x.dtype.byteorder
'='
>>>
2.获取类型字符码:
>>> x = np.array([1,2,3,4,5,6],dtype='float32')
>>> x.dtype
dtype('float32')
>>> x.dtype.char
'f'
>>>
3.获取类型长度
>>> x = np.array([1,2,3,4,5,6],dtype='float32')
>>> x.dtype
dtype('float32')
>>> x.dtype.itemsize # 4字节
4
>>>
4.获取类型名称
>>> x = np.array([1,2,3,4,5,6],dtype='float32')
>>> x.dtype
dtype('float32')
>>> x.dtype.name
'float32'
5.获取类型字符串
>>> x = np.array([1,2,3,4,5,6],dtype='float32')
>>> x.dtype
dtype('float32')
>>> x.dtype.str
'<f4'
6.获取dtype基本类型
>>> x = np.array([1,2,3,4,5,6],dtype='float32')
>>> x.dtype
dtype('float32')
>>> x.dtype.type
<type 'numpy.float32'>
>>>
如果我创建ndarray时指定的dtype='int',如果我想将这个ndarray的元素转成float类型怎么办。记住一个函数,astype()。
>>> x = np.array([1,2,3,4,5,6],dtype='int')
>>> x.dtype
dtype('int32')
>>> y = x.astype('float') # 将x中的类型转成float后赋给y,注意x中的元素不变
>>> y.dtype
dtype('float64')
还可以这样:
>>> y = np.array([1,2,3,4,5,6],dtype='int').astype('float')
>>> y
array([1., 2., 3., 4., 5., 6.])
>>> y.dtype
dtype('float64')
这样做好像意义不大,只是告诉你,这样做是可以的,就像reshape()似的。