跳转到内容

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图表示:

graph LR A[ndarray] --> B[数据缓冲区] A --> C[数据类型] A --> D[形状信息] A --> E[步幅信息] B --> F[连续的内存块] C --> G[dtype对象] D --> H[元组表示维度] E --> I[每个维度的字节步幅]

数学表示[编辑 | 编辑源代码]

NumPy中的广播规则可以用数学表示。对于两个数组解析失败 (语法错误): {\displaystyle A_{m×n}}解析失败 (语法错误): {\displaystyle B_{1×n}} ,广播后的运算相当于:

A+BAi,j+B0,j对于所有i[0,m),j[0,n)

总结[编辑 | 编辑源代码]

NumPy是Python科学计算的基石,提供了:

  • 高效的多维数组对象
  • 丰富的数学函数库
  • 线性代数、随机数生成等功能
  • 广播机制简化数组运算
  • 与其他科学计算库(如SciPy、Pandas)的良好集成

掌握NumPy是进行高效数值计算和数据分析的重要一步。建议读者通过实际项目练习,深入理解数组操作、广播机制和向量化计算的优势。