Ниже приведена реализация, которая выполняет попарную операцию на массиве массивов X. Этот подход предполагает, что операция симметрична для повышения скорости.
from itertools import combinations_with_replacement
import numpy as np
def pairwise(X, operation):
# Initialise precomputed matrix
precomputed = np.zeros((X.shape[0], X.shape[0]), dtype='int')
# Initialise iterator over objects in X
iterator = combinations_with_replacement(range(X.shape[0]), 2)
# Perform the operation on each pair
for i, j in iterator:
precomputed[i, j] = operation(X[i], X[j])
# Make symmetric and return
return precomputed + precomputed.T - np.diag(np.diag(precomputed))
Мы можем определить функцию, чтобы показать степень перекрытия вдва набора и поместите его в попарную функцию
def overlap(x, y):
return len(set(x) & set(y))
Обратите внимание, что для этого решения требуется массив numpy, поэтому для вашего примера нам нужно изменить данные перед вводом их в функцию
X = np.array([a, b, c, d])
print(pairwise(X, overlap))
Это дает результат
[[3 2 2 2]
[2 3 2 1]
[2 2 3 1]
[2 1 1 3]]