Почему numpy.argsort () тасует индексы для связей? - PullRequest
3 голосов
/ 25 октября 2019

Я использую Python 3. Проблема с numpy.argsort ().

У меня есть два массива (скажем, A и B). Я хочу упорядочить значения в массиве A по значениям в массиве B. Я использую этот код.

A_ordered = A[B.argsort()]

В массиве B есть хорошие шансы того, что возникнут связи. Иногда даже каждое значение в массиве B идентично.

Когда в B есть связи, я не хочу, чтобы значения в A меняли порядок. Следовательно, когда значения в B связаны, я ожидаю, что они сохранят свой относительный порядок индексов, используя .argsort ().

Вот пример проблемы, когда все значения в B связаны. Индексы, заданные np.argsort (), выглядят так, как будто они перемешаны.

B = np.empty(23000) #creating empty array
B.fill(0.5) #filling it with equal values of 0.5
print(B.argsort()) #trying to sort

Out[176]: array([    0, 15338, 15337, ...,  7660,  7680, 22999], dtype=int64)

Поскольку все значения в B равны, я ожидаю, что

Out[176]: array([    0, 1, 2, ...,  22997,  22998, 22999], dtype=int64)

Я не хочуиспользуйте метод ниже для сортировки A на основе B, потому что в случае связей, значения A будут использоваться для сортировки.

A = [x for _,x in sorted(zip(B,A))]

Большое спасибо!

1 Ответ

2 голосов
/ 25 октября 2019

Вы должны указать argsort, чтобы использовать стабильный метод сортировки.

>>> print(B.argsort(kind='stable')) #trying to sort
[    0     1     2 ... 22997 22998 22999]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...