我在python3.6中有两个列表,我想通过考虑w
值来排序d
。这与这个问题类似,
Sorting list based on values from another list?但我无法使用zip
,因为w
和d
不是配对数据。
我有一个代码示例,并希望获得t
变量。
我可以通过使用for循环来实现。有没有更快的方式?
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]
答案 0 :(得分: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
数组。答案 2 :(得分: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的答案。