Python Numpy开发参考文档

96 阅读4分钟

NumPy开发文档(基础篇)


一、核心数据结构与安装部署
  1. 安装方法

    • Conda安装:conda install numpy
    • Pip安装:pip install numpy
    • 导入约定:import numpy as np
  2. ndarray多维数组
    特点

    • 同构数据类型:所有元素类型一致(若混合类型,自动向上转换,如intfloat)。
    • 维度(ndim):支持一维至N维数据存储。
    • 形状(shape):描述各维度长度的元组(如(3,4)表示3行4列矩阵)。
    • 大小(size):元素总数,等于各维度长度的乘积。

二、数组创建与基础操作
  1. 创建数组

    # 从Python列表/元组转换
    vector = np.array([1, 2, 3])          # 一维数组
    matrix = np.array([[1, 2], [3, 4]])    # 二维数组
    
    # 特殊数组生成函数
    zeros_arr = np.zeros((2, 3))           # 全0矩阵(2行3列)
    ones_arr = np.ones((3, 2), dtype=int)  # 全1矩阵(指定int类型)
    range_arr = np.arange(0, 10, 2)        # 等差数组(0,2,4,...,8)
    linspace_arr = np.linspace(0, 1, 5)   # 等间隔数组(0.0, 0.25, 0.5, 0.75, 1.0)
    
  2. 文件读取与处理

    data = np.genfromtxt('data.csv', delimiter=',', dtype=str)  # 读取CSV为字符串数组
    print(data[1, 4])  # 输出第2行第5列元素
    

三、索引与切片
  1. 基本索引

    arr = np.array([[5, 10, 15], [20, 25, 30], [35, 40, 45]])
    
    # 单元素访问
    print(arr[0, 1])    # 输出10(第1行第2列)
    
    # 切片操作
    print(arr[:, 1])     # 取所有行第2列 → [10, 25, 40]
    print(arr[1:3, 0:2]) # 取第2-3行,第1-2列 → [[20, 25], [35, 40]]
    
  2. 布尔索引(条件索引)

    v = np.array([5, 10, 15, 20])
    mask = v > 10        # 生成布尔数组 [False, False, True, True]
    print(v[mask])       # 输出满足条件的元素 → [15, 20]
    

四、数组属性与计算
  1. 常用属性

    print(vector.ndim)   # 输出维度数(如1)
    print(matrix.shape)  # 输出形状(如(3,3))
    print(matrix.dtype)  # 输出数据类型(如int32、float64)
    
  2. 矢量化运算(一维数组之间的运算)

    a = np.array([1, 2, 3])
    b = np.array([4, 5, 6])
    print(a + b)         # 逐元素相加 → [5, 7, 9]
    print(a * 2)         # 标量乘法 → [2, 4, 6]
    

五、进阶操作
  1. 形状变换(数组结构变换)

    arr = np.arange(9).reshape(3, 3)  # 将0-8一维数组转为3x3矩阵
    
  2. 矩阵运算(多维数组之间的运算)

    mat_a = np.array([[1, 2], [3, 4]])
    mat_b = np.array([[5, 6], [7, 8]])
    print(np.dot(mat_a, mat_b))       #  等价 mat_a *  mat_b 矩阵乘法 → [[19, 22], [43, 50]]
    

六、注意事项
  • 类型一致性:数组元素类型需一致,混合类型将自动转换(如[1, 2.0]转为float64)。
  • 浅拷贝与深拷贝np.asarray()为浅拷贝(共享数据),np.array()为深拷贝(独立内存)。

进阶操作


一、高级数组操作
  1. 结构化数组与记录数组

    • 支持自定义复合数据类型,可处理混合类型数据集(如CSV、数据库表)。
    dtype = np.dtype([('name', 'S10'), ('age', 'i4'), ('score', 'f4')])
    data = np.array([('Alice', 25, 89.5), ('Bob', 30, 92.0)], dtype=dtype)
    print(data['age'])  # 输出:array([25, 30], dtype=int32)
    
  2. 内存视图与广播优化

    • 使用np.may_share_memory()检查数组内存共享状态,避免数据冗余。
    • 广播规则扩展:处理不同形状数组运算时,自动扩展维度匹配(如3x4矩阵与1x4数组相加)。

二、性能优化策略
  1. 向量化运算替代循环

    # 低效循环
    result = np.zeros(1000)
    for i in range(1000):
        result[i] = np.sin(i) + np.cos(i**2)
    
    # 向量化优化
    x = np.arange(1000)
    result = np.sin(x) + np.cos(x**2)
    
  2. 内存布局控制

    • 通过order='F'order='C'显式指定数组存储顺序,优化缓存命中率。
    • np.ascontiguousarray()强制转换为连续内存布局,提升运算速度。

三、数学与科学计算模块
  1. 线性代数库(numpy.linalg)

    • 矩阵分解:np.linalg.svd()(奇异值分解)、np.linalg.eig()(特征值计算)。
    • 解线性方程组:np.linalg.solve(A, b),支持超定方程组最小二乘解。
  2. 傅里叶变换(numpy.fft)

    signal = np.array([0, 1, 0, -1, 0])
    spectrum = np.fft.fft(signal)  # 快速傅里叶变换
    

四、高级IO与数据持久化
  1. 内存映射文件(Memory-mapping)

    data = np.memmap('large_array.dat', dtype='float32', mode='w+', shape=(1000000,))
    data[:100] = np.random.rand(100)  # 延迟写入磁盘
    
  2. HDF5集成(h5py库协作)

    import h5py
    with h5py.File('data.h5', 'w') as f:
        dset = f.create_dataset("mydata", (100,), dtype='i')
        dset[:] = np.arange(100)
    

五、数值计算扩展
  1. 自定义通用函数(ufunc)

    def custom_ufunc(x, y):
        return x**2 + y**3
    np_custom_ufunc = np.frompyfunc(custom_ufunc, 2, 1)
    result = np_custom_ufunc(np.array([1,2]), np.array([3,4]))
    
  2. 与Cython/Numba集成

    • 使用@numba.jit装饰器加速数值计算:
    from numba import jit
    @jit(nopython=True)
    def sum_matrix(matrix):
        total = 0.0
        for i in range(matrix.shape[0]):
            for j in range(matrix.shape[1]):
                total += matrix[i,j]
        return total
    

六、实际应用案例

图像卷积运算示例

from scipy.signal import convolve2d
image = np.random.rand(256, 256)  # 模拟灰度图像
kernel = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]])  # 边缘检测核
convolved = convolve2d(image, kernel, mode='valid')