ndarray 的数据类型
数据类型(dtype)是一个特殊对象,其中包含ndarray将内存块解释为特定类型的数据所需要的信息(元数据、有关数据的数据)。
数据类型是的NumPy可以跟其他系统的数据进行灵活的交互。在很多情况下,可以直接映射到磁盘或内存,可以在磁盘上读写二进制数据流以及连接到以C等低级语言编写的代码。NumPy数字数据类型的命名方式跟其他语言大同小异,NumPy支持的数据类型的完整列表见下表。
类型 | 类型代码 | 类型描述 |
int8, uint8 | i1, u1 | 有符号和无符号的8位(1字节)整数类型 |
int16, uint16 | i2, u2 | 有符号和无符号的16位整数类型 |
int32, uint32 | i4, u4 | 有符号和无符号的32位整数类型 |
int64, uint64 | i8, u8 | 有符号和无符号的64位整数类型 |
float16 | f2 | 半精度浮点数,在内存中占2个字节 |
float32 | f4或f | 标准单精度浮点数,与C的float兼容 |
float64 | f8或d | 标准双精度浮点数,兼容C的double和Python的float 对象 |
float128 | f16或g | 扩展精度浮点数 |
complex64, complex128, complex256 | c8, c16, c32 | 分别由两个32位、64位及128位浮点数表示的复数 |
bool | ? | 存储True和False值的布尔类型 |
object | o | Python对象类型,值可以是任何 Python对象 |
string_ | S | 固定长度的ASCII字符串类型(每个字符 1 个字节)。例如,要创建长度为 10 的字符串数据类型,使用 'S10' |
unicode_ | U | 固定长度的 Unicode 类型(每个字符的长度跟随所在系统或平台),有与 string_ 同的规范语义(例如,创建长度为10的字符串,使用'U10' ) |
提醒:有符号和无符号整数类型的区别。有符号整数可以表示正整数和负整数,而无符号整数只能表示非零整数。例如,int8(有符号 8 位整数)可以表示从 -128 到 127(含)的整数,而 uint8(无符号 8 位整数)可以表示 0 到 255。
数据类型的使用
1.创建数组时指定数据类型
arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)
print打印输出arr1数组如下:
[1. 2. 3.] 从输出结果就能看出是浮点型。也可以用arr1.dtype验证输出float64。
print打印输出arr2数组如下:
[1 2 3] 从输出结果能看出是整数类型。也可以用arr2.dtype验证输出int32。
2.创建数组时不指定数据类型
arr = np.array([1, 2, 3, 4, 5, 6])
print(arr.dtype) 输出 int64。这是因为创建数组的列表[1, 2, 3, 4, 5, 6]都是整数类型的数字,不指定类型的情况下推断生成的数组为整数类型。
在生成数组后可以用astype函数指定(转化)数据类型,如下代码:
import numpy as np
float_arr = arr.astype(np.float64)
print(float_arr)
print(float_arr.dtype)
输出:[1., 2., 3., 4., 5., 6.]
float64
通过astype函数将数据类型转化成了float64类型的数组。
下面看看我们将浮点数类型的数组转化成整数类型的数组看看会发生什么?
arr = np.array([1.7, -1.2, -3.6, 4.5, 5.9, 0.1])
print(arr)
print(arr.astype(np.int32))
输出结果如下:
[ 1.7 -1.2 -3.6 4.5 5.9 0.1]
[ 1 -1 -3 4 5 0]
从输出结果看到,float转化成int,小数部分被截掉了。
我们也可以使用astype将数字表示的字符串转化为数字类型,如下:
numeric_strings = np.array(["1.55", "-8.6", "32", "10.2"], dtype=np.string_) #bytes_
numeric_strings.astype(float)
输出:[ 1.55, -8.6 , 42. , 10.2 ]
使用 numpy.string_ 类型时要小心,因为 NumPy 中的字符串数据是固定大小的,可能会在没有警告的情况下截断输入。pandas 对非数字数据具有更直观的开箱即用行为。
以上两行代码有两个地方需要注意的。(1)我们在创建数组时指定了数据类型为string_,但是numpy2.0之后string_被移除了需要使用bytes_代替(2)上面我们在astype函数中直接使用了python自带的float类型,NumPy会将Python类型别名为其自己的等效数据类型,这里相当于float64。
注意:调用astype总是会创建一个新数组(数据的副本),即使新数据类型与旧数据类型相同。