如何用Numpy等工具高效计算多组二进制数组的成对准确率?
用Numpy高效计算二进制数组成对准确率
给定若干长度相同的二进制数组,我们需要计算每对数组间的成对准确率(即两数组元素相等的比例)。比如输入数组:
A = [[1,1,1], [0,1,0], [1,1,0]]
期望输出一个对称矩阵,其中每个位置(i,j)对应第i个和第j个数组的元素相等比例。
解决方案
利用Numpy的向量化广播机制,无需多层循环即可高效完成计算,步骤如下:
- 导入依赖并转换数组为Numpy格式
import numpy as np from fractions import Fraction # 用于格式化输出分数 # 转换输入为Numpy数组 A = np.array([[1,1,1], [0,1,0], [1,1,0]])
- 向量化计算成对准确率
通过广播实现两两数组的元素比较,再沿元素维度取平均值:
# 广播实现两两元素比较,计算相等比例 pair_accuracy = (A[:, None, :] == A[None, :, :]).mean(axis=-1)
- 格式化输出(匹配示例样式)
如果需要输出类似示例的分数/小数混合格式,可以遍历矩阵元素进行转换:
# 遍历每行,格式化输出 for row in pair_accuracy: formatted_items = [] for val in row: if val == 1.0: formatted_items.append("1. ") else: frac = Fraction(val).limit_denominator() formatted_items.append(f"{frac.numerator}/{frac.denominator}") # 对齐格式输出 print("{:>4}, {:>4}, {:>4}".format(*formatted_items))
运行结果
执行上述代码后,输出与示例完全一致:
1. , 1/3, 2/3 1/3, 1. , 2/3 2/3, 2/3, 1.
原理说明
- 广播机制:
A[:, None, :]将原数组形状从(n, m)转为(n, 1, m),A[None, :, :]转为(1, n, m),两者广播后形成(n, n, m)的三维数组,每个位置存储对应两个数组元素的相等判断结果(True=1,False=0)。 - 均值计算:
mean(axis=-1)沿最后一维(元素维度)取平均,直接得到每对数组的元素相等比例,避免了Python循环的性能开销。
内容的提问来源于stack exchange,提问作者Jane Sully
相关产品推荐
相关产品推荐

