如何使用Numpy与itertools实现二维数组无重复两行组合求和
问题解答
你提出的方案完全可行:
itertools.combinations生成的是无重复的无序元素组合,刚好可以规避1+2和2+1这类重复行对的问题;- 你也完全可以先通过combinations生成形状为
(组合数, 2, 列数)的3D数组,再沿第二轴对行求和实现需求,和循环写法相比是不同的实现思路,结果完全一致。
实现步骤
- 导入依赖库,将给定的原始列表转换为numpy数组
- 用
itertools.combinations从数组行索引中生成所有长度为2的无序组合,总共有C(9,2)=36组唯一行对 - 对每组行对做计算:第0列取第一个行的原始ID*10 + 第二个行的原始ID(如果需要大ID在前可以调整计算逻辑),剩余列直接逐元素相加
- 所有结果汇总得到最终的
double_array
完整可运行代码
import numpy as np from itertools import combinations # 初始化原数组 single_array = np.array([ [1, 80, 80, 80], [2, 80, 80, 89], [3, 52, 50, 90], [4, 39, 34, 54], [5, 37, 47, 32], [6, 42, 42, 27], [7, 42, 52, 27], [8, 38, 33, 28], [9, 42, 37, 42] ]) # 生成所有唯一两行组合,求和 double_list = [] for i, j in combinations(range(len(single_array)), 2): row_a = single_array[i] row_b = single_array[j] new_row = np.copy(row_a) # 处理第0列的组合标识 new_row[0] = row_a[0] * 10 + row_b[0] # 剩余列逐元素相加 new_row[1:] = row_a[1:] + row_b[1:] double_list.append(new_row) double_array = np.array(double_list) print(double_array)
输出验证
运行代码后输出的前3行和最后1行如下,和你给出的期望格式匹配:
[[ 12 160 160 169] [ 13 132 130 170] [ 14 119 114 134] ... [ 89 80 70 70]]
如果你需要和示例一致的最后一行[98 80 70 70],只需要把第0列的计算逻辑调整为max(row_a[0], row_b[0])*10 + min(row_a[0], row_b[0])即可。
内容的提问来源于stack exchange,提问作者Peter Wölfel
相关产品推荐
相关产品推荐

