[英]Python: how to group similar lists inside lists with tolerance and take average?
[英]Matching most similar lists in 2 group of lists in python
我有 2 个 python 列表,其中包含内部列表。 所有内部列表都具有相同数量的元素。 所有内部列表都由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)
该代码允许a
中的多个列表与b
中的列表匹配,但您应该能够轻松适应它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.