Сортировать список на основе другого списка

1

У меня есть два списка в python3.6, и я хотел бы сортировать w, рассматривая значения d. Это похоже на этот вопрос, Сортировка списка на основе значений из другого списка? , хотя я не мог использовать zip потому что w и d не являются парными данными.

У меня есть образец кода и хочу получить переменную t.

обновленный

Я мог бы сделать это, используя цикл. Есть ли более быстрый способ?

import numpy as np

w = np.arange(0.0, 1.0, 0.1)
t = np.zeros(10)
d = np.array([3.1, 0.2, 5.3, 2.2, 4.9, 6.1, 7.7, 8.1, 1.3, 9.4])
ind = np.argsort(d)
print('w', w)
print('d', d)

for i in range(10):
    t[ind[i]] = w[i]

print('t', t)
#w [ 0.   0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9]
#d [ 3.1  0.2  5.3  2.2  4.9  6.1  7.7  8.1  1.3  9.4]
#ht [ 0.3  0.   0.5  0.2  0.4  0.6  0.7  0.8  0.1  0.9]
Теги:
numpy
python-3.x
sorting

3 ответа

3
Лучший ответ

Используйте argsort так:

>>> t = np.empty_like(w)
>>> t[d.argsort()] = w
>>> t
array([0.3, 0. , 0.5, 0.2, 0.4, 0.6, 0.7, 0.8, 0.1, 0.9])
  • 1
    ЗДОРОВО! Это то, что я хотел.
1

Это парные данные, но в противоположном направлении.

  • Сделайте третий список, i, np.arange(0, 10).
  • zip это с d.
  • Сортируйте кортежи с d как ключ сортировки; i все еще сохраняю исходный индекс каждого элемента d.
  • zip это с w.
  • Сортируйте тройки (ну, пары с парой как один элемент) с i в качестве ключа сортировки.
  • Извлеките значения w в их новом порядке; это ваш массив t.
1

Ответы на этот вопрос являются фантастическими, но я считаю разумным указать, что вы не делаете то, что думаете, что делаете.

То, что вы хотите сделать: (или, по крайней мере, то, что я собираю). Вы хотите, чтобы t содержал значения w переупорядоченные, чтобы быть в отсортированном порядке d

Что вы делаете: заполнение t в отсортированном порядке d, с элементами w. Изменяется только порядок, как t заполняется до. Вы не отражаете вид d на w на t

Рассмотрим небольшую вариацию в вашем цикле for

for i in range(0,10):
    t[i] = w[ind[i]]

Это выводит t

('t', array([0.1, 0.8, 0.3, 0. , 0.4, 0.2, 0.5, 0.6, 0.7, 0.9]))

Вы можете просто адаптировать PaulPanzer к этому.

  • 1
    Спасибо за ваш комментарий. Я немного запутался в своей проблеме. Ваш ответ легко понять, что я делаю сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню