Я не уверен, что полностью понимаю, но, похоже, вы пытаетесь переиндексировать каждую ось массива, основываясь на видах указателей дендрограммы. Я предполагаю, что предполагается, что есть некоторая сравнительная логика в каждой ветви разграничения. Если это так, то будет ли это работать (?):
>>> x_idxs = [(0,1,0,0),(0,1,1,1),(0,1,1),(0,0,1),(1,1,1,1),(0,0,0,0)]
>>> y_idxs = [(1,1),(0,1),(1,0),(0,0)]
>>> a = np.random.random((len(x_idxs),len(y_idxs)))
>>> x_idxs2, xi = zip(*sorted(zip(x_idxs,range(len(x_idxs)))))
>>> y_idxs2, yi = zip(*sorted(zip(y_idxs,range(len(y_idxs)))))
>>> a2 = a[xi,:][:,yi]
x_idxs
и y_idxs
- индикаторы дендрограммы. a
- несортированная матрица. xi
и yi
- ваши новые массивы строк / столбцов. a2
- это отсортированная матрица, в то время как x_idxs2
и y_idxs2
- это новые отсортированные индикаторы дендрограммы. Это предполагает, что при создании дендрограммы столбец / строка ветви 0
всегда был сравнительно больше / меньше ветви 1
.
Если ваши y_idxs и x_idxs не списки, а массивы, то вы можете использовать np.argsort
аналогичным образом.