跳转至

numpy 面试

以下是一些常见的 NumPy 面试题,这些问题涵盖了 NumPy 的基础操作、性能优化、以及实际应用场景。可以作为八股文复习指南。

1. NumPy 是什么?为什么要使用 NumPy?

  • 回答要点
    • NumPy 是 Python 的一个开源库,主要用于数值计算。
    • 提供了支持多维数组对象(ndarray)的高效操作。
    • 提供了丰富的数学函数,用于执行数组的线性代数、傅里叶变换、随机数生成等操作。
    • 比 Python 原生的列表操作速度快,并且能够使用更少的内存。

2. 如何创建 NumPy 数组?

  • 回答要点

    • 使用 np.array() 从列表或元组创建数组。
    • 使用 np.zeros()np.ones()np.empty() 创建特定形状的数组。
    • 使用 np.arange() 创建等差数组,np.linspace() 创建等距数组。
    • 使用 np.random 模块创建随机数组。
  • 示例代码

    import numpy as np
    
    a = np.array([1, 2, 3])
    b = np.zeros((2, 3))
    c = np.ones((3, 3))
    d = np.arange(0, 10, 2)
    e = np.linspace(0, 1, 5)
    f = np.random.random((2, 2))
    

3. NumPy 数组和 Python 列表的区别是什么?

  • 回答要点
    • NumPy 数组的大小是固定的,而 Python 列表是动态的,可以增删元素。
    • NumPy 数组中的元素类型必须一致,而 Python 列表可以包含不同类型的元素。
    • NumPy 数组支持更高效的批量操作,如向量化计算,而 Python 列表通常需要使用循环。
    • NumPy 数组内存连续,支持更快的访问和操作。

4. 如何在 NumPy 中进行数组的切片和索引?

  • 回答要点

    • 通过整数索引可以访问数组的单个元素,如 arr[i, j]
    • 通过切片操作可以访问数组的子数组,如 arr[:, 1:3] 选取所有行和第二到第三列的元素。
    • 支持布尔索引和花式索引,可以基于条件或索引数组选取特定的元素。
  • 示例代码

    arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(arr[1, 2])          # 输出:6
    print(arr[:, 1:3])        # 输出:[[2 3] [5 6] [8 9]]
    print(arr[arr > 5])       # 输出:[6 7 8 9]
    print(arr[[0, 2], [1, 2]]) # 输出:[2 9]
    

5. 如何在 NumPy 中进行数组的广播?

  • 回答要点

    • 广播是指 NumPy 在不同形状的数组之间进行算术运算时自动扩展数组的能力。
    • 规则:如果数组在每个维度的大小相同或其中一个为 1,则可以进行广播。
    • 广播提高了代码的简洁性和运行效率。
  • 示例代码

    a = np.array([1, 2, 3])
    b = np.array([[1], [2], [3]])
    c = a + b  # 广播结果:[[2 3 4] [3 4 5] [4 5 6]]
    

6. NumPy 中的常用数学操作有哪些?

  • 回答要点

    • np.sum():计算数组元素的总和。
    • np.mean():计算均值。
    • np.median():计算中位数。
    • np.std():计算标准差。
    • np.dot():计算两个数组的点积。
    • np.linalg:包含线性代数相关操作,如矩阵乘法、逆矩阵、特征值等。
  • 示例代码

    arr = np.array([1, 2, 3, 4])
    print(np.sum(arr))       # 输出:10
    print(np.mean(arr))      # 输出:2.5
    print(np.dot(arr, arr))  # 输出:30
    

7. 如何在 NumPy 中处理缺失值?

  • 回答要点

    • 使用 np.nan 表示缺失值。
    • 使用 np.isnan() 检查是否有缺失值。
    • 使用 np.nan_to_num() 将缺失值替换为指定值。
    • np.nanmean()np.nansum() 等函数可以忽略 nan 值进行计算。
  • 示例代码

    arr = np.array([1, 2, np.nan, 4])
    print(np.isnan(arr))             # 输出:[False False  True False]
    print(np.nanmean(arr))           # 输出:2.3333333333333335
    print(np.nan_to_num(arr, nan=0)) # 输出:[1. 2. 0. 4.]
    

8. 如何在 NumPy 中合并和分割数组?

  • 回答要点

    • 使用 np.concatenate()np.vstack()np.hstack() 合并数组。
    • 使用 np.split()np.array_split() 分割数组。
    • 合并时需要注意数组的形状是否兼容,分割时可以指定分割点。
  • 示例代码

    a = np.array([[1, 2], [3, 4]])
    b = np.array([[5, 6]])
    c = np.vstack((a, b))   # 垂直堆叠
    d = np.hstack((a, b.T)) # 水平堆叠
    e = np.split(a, 2)      # 分割为两个数组
    

9. NumPy 的 ndarraymatrix 有什么区别?

  • 回答要点
    • ndarray 是 NumPy 的多维数组类型,支持各种数学操作。
    • matrix 是 NumPy 的矩阵类型,只支持二维,并且 * 运算符表示矩阵乘法,而不是逐元素乘法。
    • ndarray 更灵活且推荐使用,而 matrix 更接近数学上的矩阵定义。

10. 如何提升 NumPy 数组的计算效率?

  • 回答要点
    • 使用向量化操作而非 Python 循环,避免循环中逐元素操作。
    • 使用内置的 NumPy 函数,它们通常是在 C 语言层面实现的,速度更快。
    • 对于非常大的数组,使用 NumExprDask 等库进行并行计算或延迟计算。
    • 合理使用数组的内存布局(如转置、改变形状)以提升缓存命中率。

总结

这些 NumPy 面试题涵盖了从基础操作到高级用法的各个方面。熟悉这些问题及其答案,不仅可以帮助你在面试中应对自如,还能加深对 NumPy 的理解,提高在实际项目中使用 NumPy 的能力。