在python中匹配两组列表中最相似的列表
我有两个python列表,其中包含内部列表。所有内部列表都有相同数量的元素。所有内部列表由在python中匹配两组列表中最相似的列表,python,Python,我有两个python列表,其中包含内部列表。所有内部列表都有相同数量的元素。所有内部列表由0s和1s组成 a = [[0,1,0,0,0,1,1,1,0,1,0,0], [0,0,0,1,0,1,0,1,0,1,0,0], [0,1,0,1,0,0,1,1,0,1,0,0], [1,1,0,0,0,1,1,0,1,1,1,0]] b = [[0,1,1,0,0,1,1,1,0,0,0,0], [0,1,0,0,0,1,1,1,1,1,0,0], [0,1,1,0,0,1,1,0,0,1,0,1
0
s和1
s组成
a = [[0,1,0,0,0,1,1,1,0,1,0,0],
[0,0,0,1,0,1,0,1,0,1,0,0],
[0,1,0,1,0,0,1,1,0,1,0,0],
[1,1,0,0,0,1,1,0,1,1,1,0]]
b = [[0,1,1,0,0,1,1,1,0,0,0,0],
[0,1,0,0,0,1,1,1,1,1,0,0],
[0,1,1,0,0,1,1,0,0,1,0,1],
[1,1,1,0,0,1,1,1,0,1,1,0]]
我想将a
中的每个内部列表与b
中最相似的内部列表进行匹配。
最相似的意思是:在a
的内部列表中,索引值相同的元素在b的内部列表中应该尽可能多地相同
我的意思是[1,1,1,0,1,0]比[1,1,1,1,1,0]更类似于[1,0,1,0,1,0]
a
中的每个内部列表应仅与b
中的1个内部列表匹配
a
和b
可能具有不同数量的内部列表
有没有一个库或函数可以实现这么快的速度?在我的问题a和b中,有500多个内部列表,每个内部列表大约有35个元素。您可以使用NumPy快速对两个二进制列表进行异或运算,以获得两者之间的差异,然后计算差异列表中的1数。这只是一种快速计算到二进制列表之间编辑距离的方法
import numpy as np
a = [[0,1,0,0,0,1,1,1,0,1,0,0],
[0,0,0,1,0,1,0,1,0,1,0,0],
[0,1,0,1,0,0,1,1,0,1,0,0],
[1,1,0,0,0,1,1,0,1,1,1,0]]
b = [[0,1,1,0,0,1,1,1,0,0,0,0],
[0,1,0,0,0,1,1,1,1,1,0,0],
[0,1,1,0,0,1,1,0,0,1,0,1],
[1,1,1,0,0,1,1,1,0,1,1,0]]
def bindist(x, y):
xors = np.bitwise_xor(x, y)
return np.count_nonzero(xors)
for x in range(len(a)):
best_index = 0
best_dist = 9999999999999
for y in range(len(b)):
dist = bindist(a[x],b[y])
if dist < best_dist:
best_dist = dist
best_index = y
print("a", x, a[x])
print("b", best_index, b[best_index])
print("distance", best_dist)
将numpy导入为np
a=[[0,1,0,0,0,1,1,1,0,1,0,0],
[0,0,0,1,0,1,0,1,0,1,0,0],
[0,1,0,1,0,0,1,1,0,1,0,0],
[1,1,0,0,0,1,1,0,1,1,1,0]]
b=[[0,1,1,0,0,1,1,1,0,0,0,0],
[0,1,0,0,0,1,1,1,1,1,0,0],
[0,1,1,0,0,1,1,0,0,1,0,1],
[1,1,1,0,0,1,1,1,0,1,1,0]]
def绑定列表(x,y):
xor=np.按位xor(x,y)
返回np.count\u非零(XOR)
对于范围(len(a))内的x:
最佳指数=0
最佳距离=999999999
对于范围内的y(len(b)):
dist=绑定列表(a[x],b[y])
如果距离<最佳距离:
最佳距离
最佳指数=y
打印(“a”,x,a[x])
打印(“b”,最佳索引,b[最佳索引])
打印(“距离”,最佳距离)
该代码允许
a
中的多个列表与b
中的列表匹配,但您应该能够轻松地调整它。定义最相似的?我定义的Danimesjo。我会使用一些相似性度量,可能是均方误差或平均绝对误差,迭代,如果MAE/MSE的值最低,则匹配最接近