3.1 ndarray 数组的定义与创建
NumPy ndarray数组创建与属性详解:从入门到精通
本教程全面讲解NumPy ndarray数组的定义、创建方法、核心属性和数据类型,涵盖np.array()函数使用、数据类型指定、ndim/shape/size/dtype/nbytes属性详解、数值类型如int8/float32、布尔和字符串类型,以及astype()类型转换与兼容性,适合Python新手快速上手。
NumPy ndarray数组教程:定义、创建与属性详解
1. 引言
NumPy(Numerical Python)是Python科学计算的基础库,广泛应用于数据分析、机器学习等领域。其核心数据结构是ndarray(n维数组),支持高效的多维数据处理。本教程将详细讲解ndarray的定义、创建、属性和数据类型,帮助新手快速入门。
2. ndarray数组的定义与创建
ndarray是一个多维、同质的数组对象,用于存储数值数据。它类似于Python的列表,但提供了更快的运算和更丰富的功能。NumPy数组是静态类型的,这意味着所有元素必须是相同的数据类型(dtype)。
创建ndarray的基本方法是使用NumPy提供的函数,最常见的是np.array()。
2.1 基础创建:np.array()
np.array()函数可以将Python列表、元组等序列转换为NumPy数组。这是创建数组的入门方法。
示例代码:
import numpy as np
# 从列表创建一维数组
arr1 = np.array([1, 2, 3, 4])
print("一维数组:", arr1)
# 输出: [1 2 3 4]
# 从嵌套列表创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:\n", arr2)
# 输出:
# [[1 2 3]
# [4 5 6]]
2.2 数据类型指定
在创建数组时,可以通过dtype参数指定元素的数据类型,以优化内存使用和计算性能。如果不指定,NumPy会自动推断类型。
示例代码:
# 指定数据类型为float32
arr_float = np.array([1, 2, 3], dtype=np.float32)
print("float32数组:", arr_float)
print("数据类型:", arr_float.dtype)
# 输出: float32数组: [1. 2. 3.]
# 数据类型: float32
# 默认推断为int64(取决于系统)
arr_default = np.array([1, 2, 3])
print("默认数组:", arr_default.dtype)
# 输出: int64
3. 数组的核心属性
NumPy数组提供多个属性来访问其基本特征,这对于理解和操作数组至关重要。
3.1 ndim:维度数
ndim属性返回数组的维度数。例如,一维数组的ndim为1,二维数组为2。
示例代码:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("维度数:", arr.ndim) # 输出: 2
3.2 shape:形状
shape属性返回一个元组,表示每个维度的大小。例如,一个2行3列的二维数组,shape为(2, 3)。
示例代码:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("形状:", arr.shape) # 输出: (2, 3)
3.3 size:元素总数
size属性返回数组中元素的总数。它是形状元组中所有值的乘积。
示例代码:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("元素总数:", arr.size) # 输出: 6
3.4 dtype:数据类型
dtype属性返回数组元素的数据类型,如int32、float64等。这是NumPy数组的关键特性,确保数据一致性和效率。
示例代码:
arr = np.array([1.0, 2.0, 3.0])
print("数据类型:", arr.dtype) # 输出: float64
3.5 nbytes:总字节数
nbytes属性返回数组数据占用的总字节数。它等于size乘以每个元素的字节数(由dtype决定)。
示例代码:
arr = np.array([1, 2, 3], dtype=np.int32)
print("总字节数:", arr.nbytes) # 输出: 12 (3个元素 * 4字节/元素)
4. 数据类型(dtype)详解
dtype(数据类型)定义了数组中每个元素的类型,影响内存占用、精度和运算。NumPy支持多种数据类型,包括数值类型、布尔类型和字符串类型。
4.1 数值类型
数值类型用于存储整数或浮点数,常见的有:
- int8: 8位有符号整数,范围-128到127。
- int32: 32位有符号整数,范围约-2.1e9到2.1e9。
- float32: 32位单精度浮点数,精度约6-7位小数。
- float64: 64位双精度浮点数,精度约15-16位小数(默认浮点类型)。
示例代码:
# 创建不同数值类型的数组
int8_arr = np.array([1, 2, 3], dtype=np.int8)
int32_arr = np.array([100000, 200000], dtype=np.int32)
float32_arr = np.array([1.1, 2.2], dtype=np.float32)
float64_arr = np.array([3.14, 2.71], dtype=np.float64) # 等同于默认
print("int8数组:", int8_arr, "dtype:", int8_arr.dtype)
print("float32数组:", float32_arr, "dtype:", float32_arr.dtype)
4.2 布尔类型
布尔类型用于存储True或False值,通常用bool表示(实际上是int8的子类)。
示例代码:
bool_arr = np.array([True, False, True], dtype=bool)
print("布尔数组:", bool_arr) # 输出: [ True False True]
print("dtype:", bool_arr.dtype) # 输出: bool
4.3 字符串类型
字符串类型用于存储文本数据,使用str_或指定长度如U10(Unicode字符串,最多10个字符)。
示例代码:
str_arr = np.array(['hello', 'world'], dtype='U10')
print("字符串数组:", str_arr) # 输出: ['hello' 'world']
print("dtype:", str_arr.dtype) # 输出: <U10
5. 类型转换(astype())与类型兼容性
NumPy允许在数组之间转换数据类型,使用astype()方法。这在数据预处理或优化内存时很有用。
5.1 astype()方法
astype()返回一个新数组,将原数组元素转换为指定数据类型。注意:它是复制操作,原数组不变。
示例代码:
arr = np.array([1, 2, 3, 4], dtype=np.int32)
print("原数组:", arr, "dtype:", arr.dtype)
# 转换为float64
arr_float = arr.astype(np.float64)
print("转换后:", arr_float, "dtype:", arr_float.dtype)
# 输出: [1. 2. 3. 4.] dtype: float64
# 转换为int8(注意溢出)
arr_int8 = arr.astype(np.int8)
print("转换为int8:", arr_int8) # 如果值超出范围,可能会截断
5.2 类型兼容性说明
- 数值类型转换: 整数可以安全转换为浮点数(如int32到float64),但浮点数转整数可能丢失小数部分(四舍五入或截断)。
- 溢出风险: 当转换到较小范围类型(如int32到int8)时,如果值超出目标范围,可能会发生溢出(未定义行为)。
- 布尔转换: 非零数值转换为True,零转换为False;布尔值转数值时,True为1,False为0。
- 字符串转换: 数值可以转换为字符串,但反向转换可能失败或需要解析。
示例代码:
# 兼容性示例
arr = np.array([1.5, 2.7, 3.0])
# 浮点数转整数(四舍五入)
arr_int = arr.astype(np.int32)
print("浮点数转整数:", arr_int) # 输出: [1 2 3]
# 布尔转换
bool_arr = np.array([0, 1, 2], dtype=bool)
print("布尔转换:", bool_arr) # 输出: [False True True]
6. 总结
本教程详细介绍了NumPy ndarray数组的核心概念:从定义和创建(特别是np.array()函数),到核心属性如ndim、shape、size、dtype和nbytes,再深入数据类型dtype,包括数值类型(int8/int32/float32/float64)、布尔类型和字符串类型,最后讲解了类型转换方法astype()及其兼容性问题。
通过实践这些示例,新手可以快速掌握NumPy数组的基础,为后续的科学计算任务打下坚实基础。NumPy的强大功能使得数据处理更加高效和便捷,建议多练习以熟悉这些概念。
进一步学习: 探索NumPy的其他功能,如数组运算、索引、切片和广播,以充分利用其在Python中的数据科学能力。