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

统计两个数组对应索引位置元素匹配的无序对数量

问题描述

现有两个数组,一个存储字符串、一个存储整数,示例如下:

arr1 = ['cat', 'cat', 'dog', 'cow']
arr2 = [0, 0, 1, 2]

已通过循环生成所有无序索引对:

pairs = []
for i in range(4) :
    for j in range(i+1, 4) :
        pairs.append((i, j))
pairs = np.array(pairs)

输出结果:

array([[0, 1],
       [0, 2],
       [0, 3],
       [1, 2],
       [1, 3],
       [2, 3]])

需求:对每个无序索引对,检查两个数组中对应位置的两个元素是否分别相等,统计满足该条件的索引对总数。示例中仅索引对[0,1]满足条件,结果为1。

目前可通过np.all检查单个索引对,但不确定如何适配数组维度及条件;且数组规模将达N=500、1000,希望用numpy实现以避免循环。

解决方案

方法一:基于分组统计(高效,推荐大N场景)

核心思路:统计(arr1元素, arr2元素)的重复组合数,每个组合出现n次时,对应的有效无序对数为n*(n-1)//2,最后求和所有组合的对数即可。无需生成所有索引对,时间复杂度O(N)。

import numpy as np

arr1 = np.array(['cat', 'cat', 'dog', 'cow'])
arr2 = np.array([0, 0, 1, 2])

# 将两个数组按行堆叠,形成每个位置的元素配对
combined = np.stack((arr1, arr2), axis=1)
# 获取唯一配对及其出现次数
_, counts = np.unique(combined, axis=0, return_counts=True)

# 计算总满足条件的索引对数量
total = np.sum(counts * (counts - 1) // 2)
print(total)  # 输出:1

方法二:基于索引对的向量化计算

如果需要基于已生成的索引对处理,可使用np.triu_indices高效生成i<j的索引,再通过向量化比较统计结果:

import numpy as np

arr1 = np.array(['cat', 'cat', 'dog', 'cow'])
arr2 = np.array([0, 0, 1, 2])

n = len(arr1)
# 生成所有i<j的索引对,替代双重循环
i, j = np.triu_indices(n, k=1)

# 向量化检查两个数组对应位置元素是否分别相等
cond1 = arr1[i] == arr1[j]
cond2 = arr2[i] == arr2[j]

# 统计同时满足两个条件的索引对数量
total = np.sum(cond1 & cond2)
print(total)  # 输出:1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:50:26