Python数据科学手册:NumPy数组基础操作详解

Python数据科学手册:NumPy数组基础操作详解

【免费下载链接】PythonDataScienceHandbook jakevdp/PythonDataScienceHandbook: 是一个 Python 数据科学指南,旨在帮助初学者和专业人士了解和掌握数据科学的基本概念和技能。适合对数据科学和机器学习感兴趣的人员,尤其是使用 Python 进行数据处理和分析的人员。 【免费下载链接】PythonDataScienceHandbook 项目地址: https://gitcode.com/gh_mirrors/py/PythonDataScienceHandbook

还在为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}")

数组属性详解

mermaid

# 创建示例数组
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()数据统计分析

下一步学习建议

  1. 深入学习广播机制:掌握不同形状数组间的运算规则
  2. 探索高级索引:学习布尔索引、花式索引等高级技巧
  3. 性能优化:了解内存布局和计算优化策略
  4. 与其他库集成:学习NumPy与Pandas、Matplotlib等库的配合使用

NumPy是Python数据科学生态系统的基石,熟练掌握其数组操作将为你的数据科学之旅奠定坚实基础。继续实践和探索,你会发现NumPy在数据处理方面的无限可能!

实践建议:尝试用NumPy重写你之前用Python列表实现的数值计算代码,体验性能提升的效果。


如果觉得本文对你有帮助,欢迎点赞、收藏、关注!后续将带来更多NumPy高级特性和实战案例。

【免费下载链接】PythonDataScienceHandbook jakevdp/PythonDataScienceHandbook: 是一个 Python 数据科学指南,旨在帮助初学者和专业人士了解和掌握数据科学的基本概念和技能。适合对数据科学和机器学习感兴趣的人员,尤其是使用 Python 进行数据处理和分析的人员。 【免费下载链接】PythonDataScienceHandbook 项目地址: https://gitcode.com/gh_mirrors/py/PythonDataScienceHandbook

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值