人工智能之Numpy与Pandas培训文档
创建时间:2018-09-09  访问量:2912  4  0

人工智能之Numpy与Pandas培训文档

dtype参数的几种指定方式

前面在介绍创建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')

 

字节顺序符号
字节顺序
一个字符表示这个数据类型对象的字节顺序

这些其中之一:

'='	本地
'<'	小端
'>'	大端
'|'	不适用

所有的内置类型对象要以是'=',要么是'|'。

 

Numpy中的类型与字符代码
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'类型的作用。

 

Python内置与Numpy的数组类型对照
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_

 

dtype类型对象

我们之前不管用什么方式指定,其实内部创建的都是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对象。

 

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中元素类型转换,重要!!!

如果我创建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()似的。