У меня есть два списка в 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]
Используйте 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])
Это парные данные, но в противоположном направлении.
i
, np.arange(0, 10).zip
это с d
.d
как ключ сортировки; i
все еще сохраняю исходный индекс каждого элемента d
.zip
это с w
.i
в качестве ключа сортировки.w
в их новом порядке; это ваш массив t
.Ответы на этот вопрос являются фантастическими, но я считаю разумным указать, что вы не делаете то, что думаете, что делаете.
То, что вы хотите сделать: (или, по крайней мере, то, что я собираю). Вы хотите, чтобы 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 к этому.