Вам придется взвешивать каждую строку по количеству наблюдений, составляющих среднее значение.Например, pdist матрицы 3 x 2 - это сплющенный верхний треугольник (смещение 1) квадратной формы матрицы расстояний 3 x 3.
arr = np.arange(6).reshape(3,2)
arr
array([[0, 1],
[2, 3],
[4, 5]])
pdist(arr)
array([2.82842712, 5.65685425, 2.82842712])
from sklearn.metrics import pairwise_distances
square = pairwise_distances(arr)
square
array([[0. , 2.82842712, 5.65685425],
[2.82842712, 0. , 2.82842712],
[5.65685425, 2.82842712, 0. ]])
square[triu_indices(square.shape[0], 1)]
array([2.82842712, 5.65685425, 2.82842712])
Существует pairwise_distances_chuncked
функция, которая может использоваться для итерации по матрице расстояний строка за строкой, но вам нужно будет отслеживать индекс строки, чтобы убедиться, что вы берете только среднее значение в верхнем / нижнем треугольнике матрицы (матрица расстояний симметрична).Это не сложно, но я полагаю, вы внесете значительное замедление.
tot = ((arr.shape[0]**2) - arr.shape[0]) / 2
weighted_means = 0
for i in gen:
if r < arr.shape[0]:
sm = i[0, r:].mean()
wgt = (i.shape[1] - r) / tot
weighted_means += sm * wgt
r += 1