在Numpy中,数组的每个元素都必须是相同的数据类型,这种“同构性”是Numpy高效处理数据的关键之一。而数据类型(dtype)则定义了数组中元素的存储方式、占用内存的大小以及支持的运算类型。掌握Numpy的数据类型(特别是dtype和astype方法),能帮助我们更灵活地处理数据,避免内存浪费和计算错误。
为什么数据类型很重要?¶
想象一下,如果我们有一个数组存储温度数据,假设温度范围在-20到50之间,用int64(64位整数)存储显然是浪费的,因为int64能表示的范围太大了。而如果用int8(8位整数,范围-128到127)就足够了,既能节省内存,又能满足需求。因此,合理选择数据类型是优化性能的第一步。
什么是dtype?¶
dtype是Numpy中用于描述数组元素数据类型的对象,它决定了数组中元素的存储格式和运算规则。每个Numpy数组都有一个dtype属性,我们可以通过它查看数组的当前数据类型。
查看数组的dtype¶
创建一个简单的数组,然后打印它的dtype:
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr.dtype) # 输出: int64(根据系统和Numpy版本可能是int32,默认通常为int64)
如果在创建数组时显式指定数据类型:
arr_int32 = np.array([1, 2, 3, 4], dtype=np.int32)
print(arr_int32.dtype) # 输出: int32
常用的数据类型¶
Numpy支持多种数据类型,以下是最常用的几种:
| 数据类型 | 全称 | 说明 |
|---|---|---|
np.int8 |
8位有符号整数 | 范围: -128 ~ 127 |
np.int16 |
16位有符号整数 | 范围: -32768 ~ 32767 |
np.int32 |
32位有符号整数 | 范围: -2^31 ~ 2^31-1 |
np.int64 |
64位有符号整数 | 范围: -2^63 ~ 2^63-1 |
np.uint8 |
8位无符号整数 | 范围: 0 ~ 255 |
np.float32 |
32位浮点数 | 单精度,约7位有效数字 |
np.float64 |
64位浮点数(双精度) | 约15位有效数字 |
np.bool_ |
布尔类型 | True/False |
np.object_ |
Python对象类型 | 可存储任意类型 |
astype:数据类型转换¶
astype方法用于将数组的数据类型转换为指定类型,返回一个新数组,原数组的数据类型不会改变。语法为:数组.astype(目标数据类型)。
示例1:整数转浮点数¶
arr = np.array([1, 2, 3, 4], dtype=np.int32)
float_arr = arr.astype(np.float64) # 转换为双精度浮点数
print(float_arr) # 输出: [1. 2. 3. 4.]
print(float_arr.dtype) # 输出: float64
print(arr.dtype) # 输出: int32(原数组未改变)
示例2:浮点数转整数¶
arr = np.array([1.5, 2.9, 3.0, 4.1], dtype=np.float64)
int_arr = arr.astype(np.int32) # 转换为32位整数,小数部分被截断
print(int_arr) # 输出: [1 2 3 4]
注意:浮点数转整数时,只会截断小数部分(向下取整),不会四舍五入。例如
2.9会被转为2,而非3。
示例3:布尔类型转换¶
Numpy中布尔值可以与整数互转:
- 布尔转整数:True → 1,False → 0
- 整数转布尔:非0整数 → True,0 → False
# 布尔转整数
bool_arr = np.array([True, False, True])
int_from_bool = bool_arr.astype(np.int32)
print(int_from_bool) # 输出: [1 0 1]
# 整数转布尔
int_arr = np.array([0, 1, 2, 3])
bool_from_int = int_arr.astype(np.bool_)
print(bool_from_int) # 输出: [False True True True]
示例4:不同精度的整数转换¶
# int64转float32
arr = np.array([100, 200, 300], dtype=np.int64)
float_arr = arr.astype(np.float32)
print(float_arr) # 输出: [100. 200. 300.]
print(float_arr.dtype) # 输出: float32
# 大整数转小整数(可能溢出)
arr = np.array([2**30, 2**30, 2**30], dtype=np.int64)
small_int_arr = arr.astype(np.int32) # int32最大约21亿,此处数值较大会溢出
print(small_int_arr) # 输出: [-1294967296 -1294967296 -1294967296](溢出结果)
警告:转换为更小的数据类型时可能导致溢出,需确保目标类型能容纳原数据范围。
总结¶
- dtype:用于查看和指定数组的数据类型,例如
arr.dtype查看类型,np.int32指定类型。 - astype:转换数据类型,返回新数组,原数组不变。常用场景:统一数据类型、节省内存、适配运算需求。
- 注意事项:转换时关注数据范围(避免溢出)和精度损失(如浮点数转整数)。
掌握这些基础,你就能更灵活地处理Numpy数组的数据类型,为后续的数据处理和分析打下坚实基础!