如何计算由重复向量组成的列表的笛卡尔积?
解决方案:生成向量维度的全组合列表
听起来你想要的是基于原向量列表中每个维度的元素,生成所有可能的组合向量——也就是对每个维度的元素集合做笛卡尔积,对吧?我来给你一步步拆解实现方法,用Python举例说明:
核心思路
我们的目标是:
- 先把原列表中的所有向量按「维度」拆分,比如有n个d维向量,就拆成d个列表,每个列表包含所有向量在该维度上的元素
- 然后对这d个列表做笛卡尔积,得到所有可能的d维组合向量
代码实现
1. 导入工具库
我们用Python标准库中的itertools.product来快速生成笛卡尔积:
import itertools
2. 定义原向量列表
拿你的例子来说,重复2次的3维向量:
# 原向量列表:n=2,每个向量是(1,2,3) vec_list = [(1, 2, 3), (1, 2, 3)]
3. 按维度拆分向量
用zip(*vec_list)可以把所有向量的对应维度元素打包到一起:
# 拆分后得到每个维度的元素集合 dimensions = list(zip(*vec_list)) # 此时dimensions的值是 [(1, 1), (2, 2), (3, 3)]
4. 生成全组合向量
把拆分后的维度列表传入itertools.product,就能得到所有可能的组合:
# 生成所有组合并转为列表 result = list(itertools.product(*dimensions)) print(result) # 输出:[(1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3)]
5. (可选)去除重复组合
因为你的例子中所有向量都是重复的,生成的组合会有大量重复。如果需要去重,可以转成集合再转回列表:
result = list(set(itertools.product(*dimensions))) print(result) # 输出:[(1, 2, 3)]
扩展示例(非重复向量)
如果原列表是不同的向量,比如[(1,2,3), (4,5,6)],运行同样的代码会得到所有8种可能的组合:
vec_list = [(1, 2, 3), (4, 5, 6)] dimensions = list(zip(*vec_list)) result = list(itertools.product(*dimensions)) print(result) # 输出:[(1, 2, 3), (1, 2, 6), (1, 5, 3), (1, 5, 6), (4, 2, 3), (4, 2, 6), (4, 5, 3), (4, 5, 6)]
内容的提问来源于stack exchange,提问作者aliasguru
相关产品推荐
相关产品推荐

