如何以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
相关产品推荐
相关产品推荐

