Преобразование кадра данных в массив:
x = df.to_numpy()
Получение списка недиагональных ненулевых записей из матрицы разреженной симметрии c:
i, j = np.triu_indices_from(x, k=1)
v = x[i, j]
ijv = np.concatenate((i, j, v)).reshape(3, -1).T
ijv = ijv[v != 0.0]
Преобразование вернемся к фрейму данных:
df_ijv = pd.DataFrame(ijv)
Я не уверен, что это быстрее или что-то еще, но альтернативный способ сделать средний шаг - преобразовать массив numpy в ijv
или "тройная" разреженная матрица:
from scipy import sparse
coo = sparse.coo_matrix(x)
ijv = np.concatenate((coo.row, coo.col, coo.data)).reshape(3, -1).T
Теперь, учитывая симметричную c матрицу расстояний, все, что вам нужно сделать, это сохранить ненулевые элементы в верхнем правом треугольнике. Вы могли бы через это пройти oop. Или вы можете предварительно замаскировать массив с помощью np.triu_indices_from(x, k=1)
, но это побеждает всю цель этого предположительно более быстрого метода ... хммм.