NumPy开发文档(基础篇)
一、核心数据结构与安装部署
-
安装方法
- Conda安装:
conda install numpy - Pip安装:
pip install numpy - 导入约定:
import numpy as np
- Conda安装:
-
ndarray多维数组
特点:- 同构数据类型:所有元素类型一致(若混合类型,自动向上转换,如
int→float)。 - 维度(
ndim):支持一维至N维数据存储。 - 形状(
shape):描述各维度长度的元组(如(3,4)表示3行4列矩阵)。 - 大小(
size):元素总数,等于各维度长度的乘积。
- 同构数据类型:所有元素类型一致(若混合类型,自动向上转换,如
二、数组创建与基础操作
-
创建数组
# 从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) -
文件读取与处理
data = np.genfromtxt('data.csv', delimiter=',', dtype=str) # 读取CSV为字符串数组 print(data[1, 4]) # 输出第2行第5列元素
三、索引与切片
-
基本索引
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]] -
布尔索引(条件索引)
v = np.array([5, 10, 15, 20]) mask = v > 10 # 生成布尔数组 [False, False, True, True] print(v[mask]) # 输出满足条件的元素 → [15, 20]
四、数组属性与计算
-
常用属性
print(vector.ndim) # 输出维度数(如1) print(matrix.shape) # 输出形状(如(3,3)) print(matrix.dtype) # 输出数据类型(如int32、float64) -
矢量化运算(一维数组之间的运算)
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(a + b) # 逐元素相加 → [5, 7, 9] print(a * 2) # 标量乘法 → [2, 4, 6]
五、进阶操作
-
形状变换(数组结构变换)
arr = np.arange(9).reshape(3, 3) # 将0-8一维数组转为3x3矩阵 -
矩阵运算(多维数组之间的运算)
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()为深拷贝(独立内存)。
进阶操作
一、高级数组操作
-
结构化数组与记录数组
- 支持自定义复合数据类型,可处理混合类型数据集(如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) -
内存视图与广播优化
- 使用
np.may_share_memory()检查数组内存共享状态,避免数据冗余。 - 广播规则扩展:处理不同形状数组运算时,自动扩展维度匹配(如3x4矩阵与1x4数组相加)。
- 使用
二、性能优化策略
-
向量化运算替代循环
# 低效循环 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) -
内存布局控制
- 通过
order='F'或order='C'显式指定数组存储顺序,优化缓存命中率。 np.ascontiguousarray()强制转换为连续内存布局,提升运算速度。
- 通过
三、数学与科学计算模块
-
线性代数库(numpy.linalg)
- 矩阵分解:
np.linalg.svd()(奇异值分解)、np.linalg.eig()(特征值计算)。 - 解线性方程组:
np.linalg.solve(A, b),支持超定方程组最小二乘解。
- 矩阵分解:
-
傅里叶变换(numpy.fft)
signal = np.array([0, 1, 0, -1, 0]) spectrum = np.fft.fft(signal) # 快速傅里叶变换
四、高级IO与数据持久化
-
内存映射文件(Memory-mapping)
data = np.memmap('large_array.dat', dtype='float32', mode='w+', shape=(1000000,)) data[:100] = np.random.rand(100) # 延迟写入磁盘 -
HDF5集成(h5py库协作)
import h5py with h5py.File('data.h5', 'w') as f: dset = f.create_dataset("mydata", (100,), dtype='i') dset[:] = np.arange(100)
五、数值计算扩展
-
自定义通用函数(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])) -
与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')