首页
/ NumPy百题精解:从入门到进阶的100个实战练习

NumPy百题精解:从入门到进阶的100个实战练习

2026-02-04 04:21:39作者:牧宁李

还在为NumPy学习找不到系统练习而烦恼?本文提供100个精心设计的NumPy练习题,涵盖从基础操作到高级应用的各个层面,每个题目都配有详细解答和实用技巧,助你快速掌握NumPy核心技能!

📋 你将获得

  • 系统学习路径:从基础到高级的完整练习体系
  • 实战代码示例:每个题目都提供可运行的代码解决方案
  • 技巧与提示:关键函数的用法提示和最佳实践
  • 问题分类:按难度星级(★☆☆到★★★)分级,适合不同水平学习者
  • 常见陷阱:避免NumPy使用中的常见错误

🎯 练习难度分级

难度 题目数量 适合人群
★☆☆ 37题 初学者,基础操作
★★☆ 31题 进阶用户,数据处理
★★★ 32题 高级应用,性能优化

🚀 基础入门练习(★☆☆)

1. 导入NumPy包

import numpy as np

2. 打印NumPy版本和配置信息

print(np.__version__)
np.show_config()

3. 创建大小为10的空向量

Z = np.zeros(10)
print(Z)

4. 查找任意数组的内存大小

Z = np.zeros((10,10))
print("%d bytes" % (Z.size * Z.itemsize))

5. 从命令行获取NumPy add函数的文档

# 在命令行中执行
python -c "import numpy; numpy.info(numpy.add)"

6. 创建大小为10的空向量,但第五个值为1

Z = np.zeros(10)
Z[4] = 1
print(Z)

7. 创建值范围从10到49的向量

Z = np.arange(10,50)
print(Z)

8. 反转向量(第一个元素变为最后一个)

Z = np.arange(50)
Z = Z[::-1]
print(Z)

9. 创建3x3矩阵,值范围从0到8

Z = np.arange(9).reshape(3, 3)
print(Z)

10. 从[1,2,0,0,4,0]中查找非零元素的索引

nz = np.nonzero([1,2,0,0,4,0])
print(nz)

📊 进阶数据处理练习(★★☆)

44. 将笛卡尔坐标转换为极坐标

Z = np.random.random((10,2))
X, Y = Z[:,0], Z[:,1]
R = np.sqrt(X**2 + Y**2)  # 半径
T = np.arctan2(Y, X)      # 角度
print(R)
print(T)

45. 创建随机向量并替换最大值为0

Z = np.random.random(10)
Z[Z.argmax()] = 0
print(Z)

46. 创建覆盖[0,1]x[0,1]区域的结构化数组

Z = np.zeros((5,5), [('x',float),('y',float)])
Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,5),
                             np.linspace(0,1,5))
print(Z)

47. 构建柯西矩阵(Cauchy Matrix)

X = np.arange(8)
Y = X + 0.5
C = 1.0 / np.subtract.outer(X, Y)  # Cij = 1/(xi - yj)
print(np.linalg.det(C))

48. 打印每种NumPy标量类型的最小和最大可表示值

for dtype in [np.int8, np.int32, np.int64]:
   print(np.iinfo(dtype).min)
   print(np.iinfo(dtype).max)
for dtype in [np.float32, np.float64]:
   print(np.finfo(dtype).min)
   print(np.finfo(dtype).max)
   print(np.finfo(dtype).eps)  # 机器精度

🧠 高级应用练习(★★★)

75. 使用滑动窗口计算平均值

def moving_average(a, n=3):
    ret = np.cumsum(a, dtype=float)
    ret[n:] = ret[n:] - ret[:-n]
    return ret[n - 1:] / n

Z = np.arange(20)
print(moving_average(Z, n=3))

# NumPy 1.20+ 更简洁的解决方案
from numpy.lib.stride_tricks import sliding_window_view
print(sliding_window_view(Z, window_shape=3).mean(axis=-1))

76. 构建滑动窗口数组

from numpy.lib import stride_tricks

def rolling(a, window):
    shape = (a.size - window + 1, window)
    strides = (a.strides[0], a.strides[0])
    return stride_tricks.as_strided(a, shape=shape, strides=strides)

Z = rolling(np.arange(10), 3)
print(Z)

88. 使用NumPy数组实现生命游戏(Game of Life)

def iterate(Z):
    # 计算邻居数量
    N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] +
         Z[1:-1,0:-2]                + Z[1:-1,2:] +
         Z[2:  ,0:-2] + Z[2:  ,1:-1] + Z[2:  ,2:])

    # 应用规则
    birth = (N==3) & (Z[1:-1,1:-1]==0)      # 出生条件
    survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1)  # 生存条件
    Z[...] = 0
    Z[1:-1,1:-1][birth | survive] = 1
    return Z

Z = np.random.randint(0,2,(50,50))
for i in range(100): Z = iterate(Z)
print(Z)

92. 三种方法计算大向量的三次方

x = np.random.rand(int(5e7))

# 方法1:使用np.power
%timeit np.power(x,3)

# 方法2:直接乘法(最快)
%timeit x*x*x

# 方法3:使用einsum
%timeit np.einsum('i,i,i->i',x,x,x)

100. 计算自助法(Bootstrap)95%置信区间

X = np.random.randn(100)  # 随机1D数组
N = 1000  # 自助样本数量
idx = np.random.randint(0, X.size, (N, X.size))
means = X[idx].mean(axis=1)
confint = np.percentile(means, [2.5, 97.5])  # 95%置信区间
print(confint)

📈 NumPy性能优化技巧

使用向量化操作替代循环

# 慢:使用循环
result = np.zeros(1000)
for i in range(1000):
    result[i] = i * 2

# 快:向量化操作
result = np.arange(1000) * 2

利用广播(Broadcasting)机制

# 传统方法
A = np.ones((5,3))
B = np.ones((3,2))
result = np.zeros((5,2))
for i in range(5):
    for j in range(2):
        for k in range(3):
            result[i,j] += A[i,k] * B[k,j]

# 广播方法
result = A @ B  # 矩阵乘法

内存视图优化

# 创建视图而非副本
Z = np.arange(10)
Z_view = Z[::2]    # 视图,不复制数据
Z_copy = Z[::2].copy()  # 副本,复制数据

🎓 学习路线建议

graph TD
    A[NumPy基础] --> B[数组创建与操作]
    A --> C[索引与切片]
    A --> D[数据类型]
    
    B --> E[进阶数据处理]
    C --> E
    D --> E
    
    E --> F[线性代数运算]
    E --> G[随机数生成]
    E --> H[文件IO操作]
    
    F --> I[高级应用]
    G --> I
    H --> I
    
    I --> J[性能优化]
    I --> K[实际项目应用]

📋 完整题目列表

题号 题目描述 难度 关键函数
1-10 基础导入和数组创建 ★☆☆ zeros, arange, eye
11-20 矩阵操作和索引 ★☆☆ reshape, nonzero, diag
21-30 数学运算和比较 ★☆☆ random, mean, intersect1d
31-40 高级数组操作 ★★☆ seterr, datetime64, fromiter
41-50 数据分析和处理 ★★☆ allclose, argmax, genfromtxt
51-60 结构化数组 ★★☆ dtype, meshgrid, argsort
61-70 性能优化技巧 ★★★ bincount, einsum, stride_tricks
71-80 高级数学应用 ★★★ tensordot, linalg.svd, unique
81-90 实际项目案例 ★★★ sliding_window_view, game of life
91-100 统计和机器学习 ★★★ percentile, bootstrap, confidence intervals

💡 学习建议

  1. 循序渐进:从★☆☆难度开始,逐步挑战更高难度题目
  2. 动手实践:每个题目都亲自编写代码运行
  3. 理解原理:不仅记住答案,更要理解为什么这样解决
  4. 举一反三:尝试用不同方法解决同一问题
  5. 项目应用:将学到的技巧应用到实际数据分析项目中

🎯 下一步学习方向

完成这100个练习后,你可以进一步学习:

  • Pandas:用于数据清洗和分析
  • Matplotlib/Seaborn:数据可视化
  • Scikit-learn:机器学习算法
  • SciPy:科学计算扩展库
  • 深度学习框架:TensorFlow/PyTorch

通过这100个精心设计的NumPy练习,你将从入门到精通,掌握数据处理的核心技能,为后续的数据科学和机器学习学习打下坚实基础!

登录后查看全文
热门项目推荐
相关项目推荐