Я бы предложил использовать indices_merged_arr_generic_using_cp
-
Вспомогательная функция -
import numpy as np
import functools
# https://stackoverflow.com/a/46135435/ by @unutbu
def indices_merged_arr_generic_using_cp(arr):
"""
Based on cartesian_product
http://stackoverflow.com/a/11146645/190597 (senderle)
"""
shape = arr.shape
arrays = [np.arange(s, dtype='int') for s in shape]
broadcastable = np.ix_(*arrays)
broadcasted = np.broadcast_arrays(*broadcastable)
rows, cols = functools.reduce(np.multiply, broadcasted[0].shape), len(broadcasted)+1
out = np.empty(rows * cols, dtype=arr.dtype)
start, end = 0, rows
for a in broadcasted:
out[start:end] = a.reshape(-1)
start, end = end, end + rows
out[start:] = arr.flatten()
return out.reshape(cols, rows).T
Использование -
In [169]: out = indices_merged_arr_generic_using_cp(distance_matrix)
In [170]: np.savetxt('out.txt', out, fmt="%i,%i,%f")
In [171]: !cat out.txt
0,0,0.000000
0,1,1.414214
0,2,4.242641
1,0,1.414214
1,1,0.000000
1,2,2.828427
2,0,4.242641
2,1,2.828427
2,2,0.000000
Чтобы получить distance_matrix
мы также можем использовать Scipy's cdist
: cdist(points, points)
.Также есть пакет eucl_dist
(заявление об отказе: я его автор), который содержит различные методы для вычисления евклидовых расстояний, которые намного более эффективны, чем SciPy's cdist
, особенно для больших массивов.