You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Numpy优化1797张64维图像的L1距离计算性能?

用Numpy/Scipy高效计算图像对的L1距离

问题背景

你需要计算1797张8×8图像(展平为64维向量)的所有两两L1距离,生成1797×1797的距离矩阵。原嵌套循环实现速度慢,可通过Numpy的向量化运算或Scipy的专用工具大幅提升性能。

优化方案1:纯Numpy向量化实现

利用Numpy的广播机制,将图像数组扩展维度后进行批量运算,完全替代Python层面的嵌套循环:

import numpy as np

def compute_l1_distance_matrix(dataset):
    # 将8x8图像批量展平为64维向量,统一转换为int64类型
    images = np.array(dataset).reshape(-1, 64).astype(np.int64)
    # 通过广播实现所有图像对的元素差绝对值计算
    # images[:, None, :] 形状为(1797, 1, 64),images[None, :, :]形状为(1, 1797, 64)
    # 广播后自动扩展为(1797, 1797, 64)的数组,对应所有图像对的元素差
    abs_diff = np.abs(images[:, None, :] - images[None, :, :])
    # 沿特征维度(第2轴)求和,得到每个图像对的L1距离
    l1_matrix = abs_diff.sum(axis=2)
    return l1_matrix

# 调用示例
print(compute_l1_distance_matrix(digits.images))

优化方案2:Scipy专用工具实现

Scipy的cdist函数是专门为两两距离计算优化的工具,代码更简洁,性能也更优:

import numpy as np
from scipy.spatial.distance import cdist

def compute_l1_distance_matrix_scipy(dataset):
    images = np.array(dataset).reshape(-1, 64).astype(np.int64)
    # 'cityblock'即L1距离
    return cdist(images, images, metric='cityblock')

# 调用示例
print(compute_l1_distance_matrix_scipy(digits.images))

性能提升原因

原嵌套循环的核心问题是Python循环的开销——每一次循环迭代都要执行Python解释器的逻辑,速度极慢。而Numpy/Scipy的实现:

  • 将运算转移到底层C语言执行,避免了Python循环的额外开销
  • 批量处理数据,利用CPU的向量运算能力大幅提升效率
  • 类型转换一次性完成,无需在循环中重复执行

内容的提问来源于stack exchange,提问作者Shark44

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:14:59