Это немного другой подход. Но, возможно, это поможет добиться успеха. Я предлагаю использовать расчет расстояния. Вот мои тестовые данные:
from scipy.spatial.distance import pdist, squareform
m = np.random.randint(0,2,size=(10,10))
print(m)
[[1 1 1 1 0 0 0 1 0 0]
[1 0 0 0 0 0 0 0 0 1]
[1 0 1 1 1 0 1 0 0 0]
[0 1 1 1 0 0 0 0 1 1]
[0 1 0 0 1 0 0 0 1 0]
[1 1 0 0 0 0 0 0 1 1]
[0 0 1 1 1 1 1 1 0 0]
[0 1 1 0 0 1 0 0 1 1]
[1 0 1 1 1 0 0 1 0 0]
[1 0 1 0 1 1 1 0 1 0]]
Используя scipy.spatial.distance
рассчитайте расстояние между всеми столбцами.
d = squareform(pdist(m.T, 'hamming'))
print(d)
[[0. 0.7 0.5 0.5 0.5 0.7 0.5 0.5 0.7 0.6]
[0.7 0. 0.6 0.6 0.8 0.6 0.8 0.6 0.2 0.3]
[0.5 0.6 0. 0.2 0.4 0.4 0.4 0.4 0.6 0.7]
[0.5 0.6 0.2 0. 0.4 0.6 0.4 0.2 0.8 0.7]
[0.5 0.8 0.4 0.4 0. 0.4 0.2 0.4 0.6 0.9]
[0.7 0.6 0.4 0.6 0.4 0. 0.2 0.4 0.4 0.5]
[0.5 0.8 0.4 0.4 0.2 0.2 0. 0.4 0.6 0.7]
[0.5 0.6 0.4 0.2 0.4 0.4 0.4 0. 0.8 0.7]
[0.7 0.2 0.6 0.8 0.6 0.4 0.6 0.8 0. 0.3]
[0.6 0.3 0.7 0.7 0.9 0.5 0.7 0.7 0.3 0. ]]
Теперь вы можете сортировать по расстоянию до столбец.
print(m[:,np.argsort(d[:,0])])
[[1 1 1 0 0 1 0 1 0 0]
[1 0 0 0 0 0 1 0 0 0]
[1 1 1 1 1 0 0 0 0 0]
[0 1 1 0 0 0 1 1 0 1]
[0 0 0 1 0 0 0 1 0 1]
[1 0 0 0 0 0 1 1 0 1]
[0 1 1 1 1 1 0 0 1 0]
[0 1 0 0 0 0 1 1 1 1]
[1 1 1 1 0 1 0 0 0 0]
[1 1 0 1 1 0 0 0 1 1]]
Вы можете использовать это для сортировки по расстоянию от любого столбца, т.е. до 4-го столбца, изменив d[:,0]
на d[:,4]
в приведенном выше блоке.