ndarray数据类型
dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息
1 In [18]: sim1 = np.array([1,2,3],dtype=np.float64) 2 3 In [19]: sim2 = np.array([1,2,3],dtype=np.float32) 4 5 In [20]: sim1.dtype 6 Out[20]: dtype('float64') 7 8 In [21]: sim2.dtype 9 Out[21]: dtype('float32')
dtype是Numpy强大和灵活的原因之一。数值型dtype的命名方式相同:一个类型名(如float或int),后面跟一个用于表示各元素位长的数字。标准的双精度浮点值(既Python中的float)需要占用8字节(既64位)。因此,该类型在Numpy中就记作float64。
Numpy的数据类型
类型 | 类型代码 | 说明 |
int8、uint8 | i1、u1 | 有符号和无符号的8位(1个字节)整数 |
int16、uint16 | i2、u2 | 有符号和无符号的16位(2个字节)整数 |
int32、uint32 | i4、u4 | 有符号和无符号的32位(4个字节)整数 |
int64、unint64 | i8、u8 | 有符号和无符号的64位(8个字节)整数 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准的单精度浮点数 |
float64 | f8或d | 标准的双精度浮点数 |
float128 | f16或g | 扩展精度浮点数 |
complex64、complex128、complex256 | c8、c16、c32 | 分别用两个32位、64位或128位浮点数表示的复数 |
bool | ? | 存储True和False值的布尔类型 |
object | O | Python对象类型 |
string_ | S | 固定长度的字符串长度(每个字符1个字节) |
unicode_ | U | 固定长度的unicode长度(每个字符1个字节) |
可以通过ndarray的astype方法显式地转换其dtype。整数转换浮点数。
注意:调用astype无论如何都会创建出一个新的数组(原始数据的一份拷贝),即使新dtype跟老dtype相同也是如此。
1 In [22]: sim = np.array([1,2,3,4,5]) 2 3 In [23]: sim.dtype 4 Out[23]: dtype('int64') 5 6 In [24]: float_sim = sim.astype(np.float64) 7 8 In [25]: float_sim.dtype 9 Out[25]: dtype('float64')
浮点数转换成整数,小数点部分将会被截断。
1 In [26]: sim = np.array([3.7,-1.6,4.7,-2.3,9.0]) 2 3 In [27]: sim 4 Out[27]: array([ 3.7, -1.6, 4.7, -2.3, 9. ]) 5 6 In [28]: sim.astype(np.int32) 7 Out[28]: array([ 3, -1, 4, -2, 9], dtype=int32)
字符串全是数字,可以用astype将其转换为数值形式。
1 In [31]: number_strings = np.array(['1.26','-8','-4.6'],dtype=np.string_) 2 3 In [32]: number_strings.astype(np.float64) 4 Out[32]: array([ 1.26, -8. , -4.6 ])
还可以用简洁的代码来表示dtype。
1 In [33]: empty_uint32 = np.empty(8,dtype='u4') 2 3 In [34]: empty_uint32 4 Out[34]: 5 array([ 0, 1072693248, 1717986918, 1073899110, 0, 6 1074790400, 0, 1075052544], dtype=uint32)