Python Numpy 基础
外观
Python NumPy基础[编辑 | 编辑源代码]
NumPy(Numerical Python的简称)是Python中用于科学计算的核心库之一,提供了高性能的多维数组对象(ndarray)以及用于操作这些数组的工具。它是数据分析、机器学习、图像处理等领域的基础库,因其高效的数值计算能力而广受欢迎。
简介[编辑 | 编辑源代码]
NumPy的核心是ndarray(N-dimensional array,N维数组)对象,它是一个快速、灵活的同构数据容器,可以存储相同类型的元素。与Python原生列表相比,NumPy数组在存储和计算上更高效,支持向量化操作(无需显式循环),并且提供了丰富的数学函数。
NumPy的主要特点包括:
- 高效的数组操作(广播、索引、切片等)
- 内置数学函数(线性代数、傅里叶变换、随机数生成等)
- 与其他语言(如C/C++/Fortran)的接口
- 内存优化和并行计算支持
安装NumPy[编辑 | 编辑源代码]
NumPy可以通过pip安装:
pip install numpy
或者在Anaconda环境中:
conda install numpy
基本操作[编辑 | 编辑源代码]
创建数组[编辑 | 编辑源代码]
NumPy提供了多种创建数组的方式:
import numpy as np
# 从Python列表创建
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1) # 输出: [1 2 3 4 5]
# 创建全零数组
zeros = np.zeros(5)
print(zeros) # 输出: [0. 0. 0. 0. 0.]
# 创建全一数组
ones = np.ones((2, 3)) # 2行3列
print(ones)
# 输出:
# [[1. 1. 1.]
# [1. 1. 1.]]
# 创建等差数列
range_arr = np.arange(0, 10, 2) # 从0开始,到10(不含),步长2
print(range_arr) # 输出: [0 2 4 6 8]
# 创建随机数组
random_arr = np.random.rand(3, 3) # 3x3的随机数组,值在[0,1)之间
print(random_arr)
数组属性[编辑 | 编辑源代码]
NumPy数组有几个重要属性:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # 数组维度:(2, 3)
print(arr.ndim) # 数组维数:2
print(arr.size) # 数组元素总数:6
print(arr.dtype) # 数组数据类型:int64(取决于系统)
数组索引和切片[编辑 | 编辑源代码]
NumPy的索引和切片与Python列表类似,但支持多维操作:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 获取单个元素
print(arr[1, 2]) # 输出: 6(第二行第三列)
# 切片
print(arr[:2, 1:]) # 前两行,第二列到最后
# 输出:
# [[2 3]
# [5 6]]
# 布尔索引
mask = arr > 5
print(mask)
# 输出:
# [[False False False]
# [False False True]
# [ True True True]]
print(arr[mask]) # 输出: [6 7 8 9]
数组运算[编辑 | 编辑源代码]
NumPy支持元素级运算和矩阵运算:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 元素级加法
print(a + b) # 输出: [5 7 9]
# 元素级乘法
print(a * b) # 输出: [4 10 18]
# 点积(内积)
print(np.dot(a, b)) # 输出: 32 (1*4 + 2*5 + 3*6)
# 广播示例
print(a + 5) # 输出: [6 7 8]
数学函数[编辑 | 编辑源代码]
NumPy提供了丰富的数学函数:
arr = np.array([1, 4, 9, 16])
# 平方根
print(np.sqrt(arr)) # 输出: [1. 2. 3. 4.]
# 三角函数
angles = np.array([0, np.pi/2, np.pi])
print(np.sin(angles)) # 输出: [0.0000000e+00 1.0000000e+00 1.2246468e-16]
# 指数和对数
print(np.exp([1, 2, 3])) # 输出: [ 2.71828183 7.3890561 20.08553692]
print(np.log([1, 10, 100])) # 输出: [0. 2.30258509 4.60517019]
线性代数[编辑 | 编辑源代码]
NumPy的linalg
模块提供了线性代数运算:
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵乘法
print(np.matmul(A, B))
# 输出:
# [[19 22]
# [43 50]]
# 行列式
print(np.linalg.det(A)) # 输出: -2.0000000000000004
# 逆矩阵
print(np.linalg.inv(A))
# 输出:
# [[-2. 1. ]
# [ 1.5 -0.5]]
实际应用案例[编辑 | 编辑源代码]
图像处理[编辑 | 编辑源代码]
NumPy数组可以表示图像(高度×宽度×颜色通道):
# 假设有一个100x100的灰度图像
image = np.random.randint(0, 256, (100, 100), dtype=np.uint8)
# 应用高斯模糊(简化版)
def gaussian_blur(img, sigma=1):
size = int(2 * np.ceil(2 * sigma) + 1
x = np.arange(size) - size // 2
kernel = np.exp(-x**2 / (2 * sigma**2))
kernel = kernel / kernel.sum()
# 对行和列分别应用一维高斯滤波
blurred = np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 0, img)
blurred = np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 1, blurred)
return blurred
blurred_image = gaussian_blur(image)
数据分析[编辑 | 编辑源代码]
计算学生成绩的统计量:
scores = np.array([88, 72, 93, 85, 91, 78, 84, 90, 76, 89])
print(f"平均分: {np.mean(scores)}") # 平均分: 84.6
print(f"中位数: {np.median(scores)}") # 中位数: 86.0
print(f"标准差: {np.std(scores)}") # 标准差: 6.87638650481804
print(f"最高分: {np.max(scores)}") # 最高分: 93
print(f"最低分: {np.min(scores)}") # 最低分: 72
性能比较[编辑 | 编辑源代码]
NumPy比纯Python实现快得多:
import time
# 纯Python实现点积
def python_dot(a, b):
return sum(x * y for x, y in zip(a, b))
size = 1000000
a = list(range(size))
b = list(range(size, 0, -1))
start = time.time()
python_result = python_dot(a, b)
python_time = time.time() - start
a_np = np.arange(size)
b_np = np.arange(size, 0, -1)
start = time.time()
numpy_result = np.dot(a_np, b_np)
numpy_time = time.time() - start
print(f"Python时间: {python_time:.4f}s, NumPy时间: {numpy_time:.4f}s")
print(f"加速比: {python_time/numpy_time:.1f}x")
典型输出:
Python时间: 0.1254s, NumPy时间: 0.0012s 加速比: 104.5x
内存布局[编辑 | 编辑源代码]
NumPy数组的内存布局可以用mermaid图表示:
数学表示[编辑 | 编辑源代码]
NumPy中的广播规则可以用数学表示。对于两个数组解析失败 (语法错误): {\displaystyle A_{m×n}} 和解析失败 (语法错误): {\displaystyle B_{1×n}} ,广播后的运算相当于:
总结[编辑 | 编辑源代码]
NumPy是Python科学计算的基石,提供了:
- 高效的多维数组对象
- 丰富的数学函数库
- 线性代数、随机数生成等功能
- 广播机制简化数组运算
- 与其他科学计算库(如SciPy、Pandas)的良好集成
掌握NumPy是进行高效数值计算和数据分析的重要一步。建议读者通过实际项目练习,深入理解数组操作、广播机制和向量化计算的优势。