Python数据科学手册:NumPy数组基础操作详解
还在为Python数据处理效率低下而烦恼?还在用原生列表进行复杂的数值计算?本文将带你深入掌握NumPy数组的基础操作,让你在数据科学道路上事半功倍!
读完本文,你将掌握:
- NumPy数组的创建和基本属性
- 数组索引和切片的高级技巧
- 数组形状变换和拼接方法
- 向量化操作的性能优势
- 常用数学函数和统计操作
NumPy简介与安装
NumPy(Numerical Python)是Python科学计算的核心库,提供了高性能的多维数组对象和数学函数。与Python原生列表相比,NumPy数组在存储效率和计算速度上都有显著优势。
import numpy as np
print(f"NumPy版本: {np.__version__}")
数组创建基础
从Python列表创建数组
# 一维数组
arr1d = np.array([1, 2, 3, 4, 5])
print(f"一维数组: {arr1d}")
# 二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(f"二维数组:\n{arr2d}")
# 三维数组
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(f"三维数组形状: {arr3d.shape}")
使用内置函数创建数组
# 创建全零数组
zeros = np.zeros((3, 4))
print(f"全零数组:\n{zeros}")
# 创建全一数组
ones = np.ones((2, 3))
print(f"全一数组:\n{ones}")
# 创建单位矩阵
eye = np.eye(3)
print(f"单位矩阵:\n{eye}")
# 创建等差数列
linspace = np.linspace(0, 10, 5)
print(f"等差数列: {linspace}")
# 创建整数序列
arange = np.arange(0, 10, 2)
print(f"整数序列: {arange}")
随机数组生成
# 设置随机种子确保结果可重现
rng = np.random.default_rng(seed=42)
# 生成随机整数
random_ints = rng.integers(0, 10, size=(3, 4))
print(f"随机整数数组:\n{random_ints}")
# 生成随机浮点数
random_floats = rng.random((2, 3))
print(f"随机浮点数数组:\n{random_floats}")
# 生成标准正态分布
normal = rng.standard_normal((2, 2))
print(f"标准正态分布:\n{normal}")
数组属性详解
# 创建示例数组
x = rng.integers(10, size=(2, 3, 4))
print(f"数组维度: {x.ndim}")
print(f"数组形状: {x.shape}")
print(f"数组大小: {x.size}")
print(f"数据类型: {x.dtype}")
print(f"元素字节数: {x.itemsize}")
print(f"总字节数: {x.nbytes}")
数组索引与切片
基础索引操作
# 一维数组索引
arr = np.array([10, 20, 30, 40, 50])
print(f"第一个元素: {arr[0]}")
print(f"最后一个元素: {arr[-1]}")
print(f"倒数第二个元素: {arr[-2]}")
# 二维数组索引
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f"第一行第二列: {matrix[0, 1]}")
print(f"最后一行第一列: {matrix[-1, 0]}")
切片操作详解
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 基础切片
print(f"前三个元素: {arr[:3]}")
print(f"索引3之后的元素: {arr[3:]}")
print(f"索引2到5的元素: {arr[2:6]}")
print(f"每隔一个元素: {arr[::2]}")
print(f"从索引1开始每隔一个元素: {arr[1::2]}")
print(f"反转数组: {arr[::-1]}")
# 多维数组切片
matrix = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print(f"前两行前三列:\n{matrix[:2, :3]}")
print(f"所有行,每隔一列:\n{matrix[:, ::2]}")
print(f"所有列,每隔一行:\n{matrix[::2, :]}")
布尔索引和花式索引
# 布尔索引
arr = np.array([1, 2, 3, 4, 5, 6])
mask = arr > 3
print(f"大于3的元素: {arr[mask]}")
# 花式索引
indices = [0, 2, 4]
print(f"索引0,2,4的元素: {arr[indices]}")
# 多维花式索引
matrix = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
row_indices = [0, 2]
col_indices = [1, 0]
print(f"特定行列元素: {matrix[row_indices, col_indices]}")
数组形状操作
重塑数组形状
arr = np.arange(12)
print(f"原始数组: {arr}")
# 重塑为3x4矩阵
reshaped = arr.reshape(3, 4)
print(f"重塑后:\n{reshaped}")
# 使用-1自动计算维度
auto_reshape = arr.reshape(2, -1) # 自动计算为2x6
print(f"自动重塑:\n{auto_reshape}")
# 展平数组
flattened = reshaped.flatten()
print(f"展平后: {flattened}")
数组转置和轴交换
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print(f"原始矩阵:\n{matrix}")
# 转置
transposed = matrix.T
print(f"转置后:\n{transposed}")
# 三维数组轴交换
arr_3d = np.arange(24).reshape(2, 3, 4)
print(f"原始形状: {arr_3d.shape}")
# 交换轴0和轴1
swapped = np.swapaxes(arr_3d, 0, 1)
print(f"交换轴后形状: {swapped.shape}")
数组拼接与分割
数组拼接
# 水平拼接
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
h_stack = np.hstack([a, b])
print(f"水平拼接:\n{h_stack}")
# 垂直拼接
v_stack = np.vstack([a, b])
print(f"垂直拼接:\n{v_stack}")
# 深度拼接
d_stack = np.dstack([a, b])
print(f"深度拼接:\n{d_stack}")
数组分割
arr = np.arange(12).reshape(3, 4)
print(f"原始数组:\n{arr}")
# 水平分割
h_split = np.hsplit(arr, 2)
print("水平分割结果:")
for i, part in enumerate(h_split):
print(f"部分{i+1}:\n{part}")
# 垂直分割
v_split = np.vsplit(arr, 3)
print("垂直分割结果:")
for i, part in enumerate(v_split):
print(f"部分{i+1}:\n{part}")
向量化操作与通用函数
基本数学运算
x = np.array([1, 2, 3, 4, 5])
y = np.array([6, 7, 8, 9, 10])
print(f"加法: {x + y}")
print(f"减法: {x - y}")
print(f"乘法: {x * y}")
print(f"除法: {x / y}")
print(f"幂运算: {x ** 2}")
print(f"模运算: {x % 2}")
通用函数(ufuncs)应用
# 三角函数
angles = np.array([0, np.pi/2, np.pi])
print(f"正弦值: {np.sin(angles)}")
print(f"余弦值: {np.cos(angles)}")
print(f"正切值: {np.tan(angles)}")
# 指数和对数函数
values = np.array([1, 2, 3])
print(f"指数: {np.exp(values)}")
print(f"自然对数: {np.log(values)}")
print(f"以2为底对数: {np.log2(values)}")
print(f"以10为底对数: {np.log10(values)}")
# 统计函数
data = np.array([1.2, 2.8, 3.1, 4.5, 2.1])
print(f"平均值: {np.mean(data)}")
print(f"标准差: {np.std(data)}")
print(f"方差: {np.var(data)}")
print(f"最小值: {np.min(data)}")
print(f"最大值: {np.max(data)}")
print(f"中位数: {np.median(data)}")
广播机制
# 标量与数组运算
arr = np.array([1, 2, 3])
print(f"数组加标量: {arr + 5}")
print(f"数组乘标量: {arr * 2}")
# 不同形状数组运算
a = np.array([[1], [2], [3]]) # 3x1
b = np.array([4, 5, 6]) # 1x3
print(f"广播加法:\n{a + b}")
print(f"广播乘法:\n{a * b}")
性能对比:向量化 vs 循环
import time
# 创建大型数组
large_array = rng.integers(1, 100, size=1000000)
# 使用循环计算倒数
def compute_reciprocals_loop(values):
output = np.empty(len(values))
for i in range(len(values)):
output[i] = 1.0 / values[i]
return output
# 使用向量化计算倒数
def compute_reciprocals_vectorized(values):
return 1.0 / values
# 性能测试
start = time.time()
result_loop = compute_reciprocals_loop(large_array)
loop_time = time.time() - start
start = time.time()
result_vectorized = compute_reciprocals_vectorized(large_array)
vectorized_time = time.time() - start
print(f"循环耗时: {loop_time:.4f}秒")
print(f"向量化耗时: {vectorized_time:.6f}秒")
print(f"速度提升: {loop_time/vectorized_time:.1f}倍")
实用技巧与最佳实践
内存视图与复制
# 创建原始数组
original = np.array([[1, 2, 3], [4, 5, 6]])
print(f"原始数组:\n{original}")
# 创建视图(不复制数据)
view = original[:2, :2]
view[0, 0] = 99
print(f"修改视图后原始数组:\n{original}")
# 创建副本(复制数据)
copy = original[:2, :2].copy()
copy[0, 0] = 42
print(f"修改副本后原始数组:\n{original}")
条件操作与掩码
# 创建数据数组
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 创建条件掩码
mask = (data > 3) & (data < 8)
print(f"条件掩码: {mask}")
print(f"满足条件的元素: {data[mask]}")
# 使用where函数
result = np.where(data > 5, data * 2, data)
print(f"条件处理结果: {result}")
数组排序与搜索
# 数组排序
unsorted = np.array([3, 1, 4, 1, 5, 9, 2, 6])
sorted_arr = np.sort(unsorted)
print(f"排序后: {sorted_arr}")
# 获取排序索引
indices = np.argsort(unsorted)
print(f"排序索引: {indices}")
# 数组搜索
values = np.array([1, 3, 5, 7, 9])
search_result = np.searchsorted(values, [2, 4, 6, 8])
print(f"搜索插入位置: {search_result}")
总结与进阶学习
通过本文的学习,你已经掌握了NumPy数组的基础操作技能。NumPy的强大之处在于其向量化操作和广播机制,能够显著提升数据处理的效率。
关键要点回顾
| 操作类型 | 主要函数/方法 | 应用场景 |
|---|---|---|
| 数组创建 | np.array(), np.zeros(), np.ones() | 初始化数组数据 |
| 索引切片 | arr[index], arr[start:stop:step] | 数据选择和子集操作 |
| 形状操作 | reshape(), flatten(), T | 数据维度变换 |
| 数学运算 | +, -, *, /, ** | 数值计算 |
| 统计函数 | mean(), std(), min(), max() | 数据统计分析 |
下一步学习建议
- 深入学习广播机制:掌握不同形状数组间的运算规则
- 探索高级索引:学习布尔索引、花式索引等高级技巧
- 性能优化:了解内存布局和计算优化策略
- 与其他库集成:学习NumPy与Pandas、Matplotlib等库的配合使用
NumPy是Python数据科学生态系统的基石,熟练掌握其数组操作将为你的数据科学之旅奠定坚实基础。继续实践和探索,你会发现NumPy在数据处理方面的无限可能!
实践建议:尝试用NumPy重写你之前用Python列表实现的数值计算代码,体验性能提升的效果。
如果觉得本文对你有帮助,欢迎点赞、收藏、关注!后续将带来更多NumPy高级特性和实战案例。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



