NumPy是Python科学计算的核心库,其高性能多维数组对象ndarray和向量化运算能大幅提升计算效率。本文将系统讲解NumPy数组的创建、操作、统计、文件IO及高级技巧,适合需要处理数值数据的Python开发者。
一、核心数据结构:ndarray
ndarray是一个同构数据的多维容器。先导入NumPy。
- import numpy as np
- # 从列表或元组创建一维、二维数组
- arr_from_list = np.array([1, 2, 3, 4, 5])
- arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
- # 特殊数组:全0、全1、满值、单位矩阵、等差数列、等间隔数列
- zeros_arr = np.zeros((3, 4)) # 3行4列全0
- ones_arr = np.ones((2, 3)) # 2行3列全1
- full_arr = np.full((2, 2), 7) # 2x2所有元素为7
- eye_arr = np.eye(3) # 3x3单位矩阵
- arange_arr = np.arange(0, 10, 2) # [0,2,4,6,8]
- linspace_arr = np.linspace(0, 1, 5) # [0., 0.25, 0.5, 0.75, 1.]
复制代码
数组属性是操作基础:
- arr = np.array([[1,2,3],[4,5,6]])
- print("维度:",arr.ndim) # 2
- print("形状:",arr.shape) # (2,3)
- print("元素总数:",arr.size) # 6
- print("数据类型:",arr.dtype) # int64
复制代码
二、数组索引与切片
支持类似Python列表的索引和切片,但多维数组更灵活。
- arr = np.array([10,20,30,40,50])
- print(arr[0]) # 10
- print(arr[-1]) # 50
- print(arr[1:4]) # [20 30 40]
- print(arr[::2]) # [10 30 50]
- # 多维索引与切片
- arr_2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
- print(arr_2d[0,1]) # 2
- print(arr_2d[1]) # [4 5 6]
- print(arr_2d[:,1]) # [2 5 8]
- print(arr_2d[0:2,1:3]) # [[2 3] [5 6]]
复制代码
三、数组操作与变形
3.1 形状操作
- arr = np.arange(12)
- print(arr) # [0 1 2 3 4 5 6 7 8 9 10 11]
- reshaped = arr.reshape(3,4)
- print(reshaped)
- # 展平:flatten返回新数组,ravel返回视图
- flattened = reshaped.flatten()
- raveled = reshaped.ravel()
- print("展平后:",flattened)
- print("ravel:",raveled)
- # 转置
- transposed = reshaped.T
- print(transposed)
复制代码
3.2 拼接与分割
- a = np.array([[1,2],[3,4]])
- b = np.array([[5,6],[7,8]])
- # 垂直拼接(沿轴0)
- v_stack = np.vstack((a,b))
- print("垂直拼接:\n",v_stack)
- # 水平拼接(沿轴1)
- h_stack = np.hstack((a,b))
- print("水平拼接:\n",h_stack)
- # 数组分割
- arr = np.arange(9).reshape(3,3)
- split_arr = np.split(arr,3,axis=0)
- print("沿行分割:",split_arr)
复制代码
四、通用函数(ufunc)与广播
通用函数对数组逐元素运算,广播机制允许不同形状数组运算。
- arr = np.array([1.0,4.0,9.0])
- print("平方根:",np.sqrt(arr)) # [1. 2. 3.]
- print("指数:",np.exp(arr))
- print("正弦:",np.sin(arr))
- # 广播:形状(2,3)与(3,)相加
- a = np.array([[1,2,3],[4,5,6]])
- b = np.array([10,20,30])
- print("广播加法:\n",a+b) # b被广播为[[10,20,30],[10,20,30]]
复制代码
五、数学与统计函数
- arr = np.array([[1,2,3],[4,5,6]])
- print("总和:",np.sum(arr)) # 21
- print("列和:",np.sum(arr,axis=0)) # [5 7 9]
- print("行和:",np.sum(arr,axis=1)) # [6 15]
- print("平均值:",np.mean(arr)) # 3.5
- print("标准差:",np.std(arr))
- print("最小值:",np.min(arr))
- print("最大值:",np.max(arr))
- print("累积和:",np.cumsum(arr)) # [1 3 6 10 15 21]
- print("累积积:",np.cumprod(arr))
复制代码
六、随机数生成
使用random模块,支持多种分布。
- np.random.seed(42) # 设置种子保证可复现
- # 均匀分布[0,1)
- uniform_arr = np.random.rand(3,4)
- uniform_range = np.random.uniform(5.0,10.0,size=(2,3))
- # 标准正态分布
- normal_arr = np.random.randn(5)
- normal_custom = np.random.normal(loc=100,scale=15,size=1000)
- # 随机整数[0,10)
- int_arr = np.random.randint(0,10,size=7)
- # 带概率的随机选择
- choices = np.random.choice(['a','b','c','d'],size=10,p=[0.1,0.2,0.3,0.4])
复制代码
七、排序与搜索
- arr = np.array([3,1,4,1,5,9,2])
- sorted_arr = np.sort(arr) # 返回新数组
- print(sorted_arr) # [1 1 2 3 4 5 9]
- print(arr) # 原数组不变
- arr.sort() # 原地排序
- print(arr) # [1 1 2 3 4 5 9]
- # 多维排序
- arr_2d = np.array([[3,1,4],[1,5,9]])
- print(np.sort(arr_2d,axis=0)) # 按列排序
- print(np.sort(arr_2d,axis=1)) # 按行排序
- # 获取排序索引
- arr = np.array([30,10,40])
- indices = np.argsort(arr)
- print(indices) # [1 0 2]
复制代码
八、文件输入输出
支持文本和二进制格式。
- arr = np.array([[1,2,3],[4,5,6]])
- # 保存为文本文件(逗号分隔)
- np.savetxt('data.txt',arr,delimiter=',',fmt='%d')
- # 加载文本文件
- loaded = np.loadtxt('data.txt',delimiter=',',dtype=np.int32)
- print(loaded)
- # 二进制文件保存数据类型和形状
- np.save('data_binary.npy',arr)
- loaded_bin = np.load('data_binary.npy')
- print(loaded_bin)
复制代码
九、高级技巧
9.1 布尔索引与花式索引
- arr = np.array([1,2,3,4,5,6])
- mask = arr > 3
- print(mask) # [False False False True True True]
- print(arr[mask]) # [4 5 6]
- print(arr[arr%2==0]) # [2 4 6]
- # 花式索引
- indices = [0,2,4]
- print(arr[indices]) # [1 3 5]
- arr_2d = np.arange(12).reshape(3,4)
- print(arr_2d[[0,2]]) # 第0和第2行
- print(arr_2d[[0,2],[1,3]]) # 取(0,1)和(2,3)位置元素 [1 11]
复制代码
9.2 线性代数运算
- a = np.array([[1,2],[3,4]])
- b = np.array([[5,6],[7,8]])
- dot = np.dot(a,b) # 等价于 a@b
- print("矩阵乘法:\n",dot)
- print("转置:\n",a.T)
- print("逆矩阵:\n",np.linalg.inv(a))
- print("行列式:",np.linalg.det(a))
- print("特征值、特征向量:",np.linalg.eig(a))
复制代码
9.3 数组去重与集合运算
- arr = np.array([1,2,2,3,4,4,4,5])
- print("唯一值:",np.unique(arr)) # [1 2 3 4 5]
- print("出现次数(非负整数):",np.bincount(arr)) # 索引为值,元素为次数
- a = np.array([1,2,3,4,5])
- b = np.array([3,4,5,6,7])
- print("交集:",np.intersect1d(a,b)) # [3 4 5]
- print("并集:",np.union1d(a,b)) # [1 2 3 4 5 6 7]
- print("差集(a-b):",np.setdiff1d(a,b)) # [1 2]
复制代码
以上就是NumPy数组的完整操作指南。掌握这些基础,你就能高效处理数值计算任务。更多NumPy进阶用法可参考官方文档。 |