统计两个数组对应索引位置元素匹配的无序对数量
问题描述
现有两个数组,一个存储字符串、一个存储整数,示例如下:
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
相关产品推荐
相关产品推荐

