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

如何使用Numpy与itertools实现二维数组无重复两行组合求和

问题解答

你提出的方案完全可行:

  1. itertools.combinations 生成的是无重复的无序元素组合,刚好可以规避1+2和2+1这类重复行对的问题;
  2. 你也完全可以先通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:06:02