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

如何以Pythonic方式从存储二维点的字典生成所有向量组合?

问题:生成所有两点间向量的Pythonic实现

我有一个存储二维数组数据点的字典,示例如下:

centroids = {0: array([ 8, 9]),
          1: array([ 4, 14]),
          2: array([ 2, 11]),
          3: array([19, 11]),
          4: array([15, 10]),
          5: array([ 2, 12])}

两点间的向量通过终点减起点得到,我想要获取这些数组值能生成的所有可能向量,例如从键0到1、0到2、0到3、4到5等的向量。期望输出格式如下:

result = {0 to 1: [-4,5],
          0 to 2: [-6,2],
          0 to 3: [11,2]....}

请问是否存在Pythonic的实现方式,尽可能减少for循环的使用?


实现方案

可以利用itertools.combinations生成所有不重复的起点-终点键对,再结合字典推导式完成,这是非常Pythonic的写法,几乎看不到显式的for循环:

import itertools
import numpy as np

centroids = {0: np.array([8, 9]),
             1: np.array([4, 14]),
             2: np.array([2, 11]),
             3: np.array([19, 11]),
             4: np.array([15, 10]),
             5: np.array([2, 12])}

# 生成所有单向不重复的向量
result = {f"{start} to {end}": (centroids[end] - centroids[start]).tolist()
          for start, end in itertools.combinations(centroids.keys(), 2)}

关键细节说明:

  • itertools.combinations(centroids.keys(), 2):自动生成所有长度为2的不重复键对,确保每个起点-终点组合只出现一次(比如仅生成(0,1),不会重复生成(1,0))
  • 字典推导式:遍历每个键对,计算终点数组减起点数组的向量,转成列表后作为值,键用格式化字符串f"{start} to {end}"生成
  • 如果需要包含反向向量(比如同时保留0→1和1→0),只需把combinations替换为itertools.permutations即可

如果不想依赖itertools,也可以用嵌套推导式实现,但效率稍低:

result = {f"{start} to {end}": (centroids[end] - centroids[start]).tolist()
          for start in centroids
          for end in centroids
          if start != end}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:40:32