根据排序值匹配两个数组的元素(Python)

根据排序值匹配两个数组的元素(Python),python,numpy,Python,Numpy,我有点受不了这一点,尝试了一些这里提到的东西,但没有帮助。基本上,我有以下阵列: returns = np.array([0.01, 0.2, 0.05, -0.01, 0.3, -0.5]) weights = np.array([0.3, 0.25, 0.2, 0.15, 0.1, 0]) 其想法是创建动态权重,其中最高权重与最高回报相匹配。我试着根据彼此对两个数组(或列表)进行排序,但没有帮助(如本文所述),因为这实际上取决于权重初始化 所需的输出是(权重根据最大/最小值和返回数组值之间

我有点受不了这一点,尝试了一些这里提到的东西,但没有帮助。基本上,我有以下阵列:

returns = np.array([0.01, 0.2, 0.05, -0.01, 0.3, -0.5])
weights = np.array([0.3, 0.25, 0.2, 0.15, 0.1, 0])
其想法是创建动态权重,其中最高权重与最高回报相匹配。我试着根据彼此对两个数组(或列表)进行排序,但没有帮助(如本文所述),因为这实际上取决于权重初始化

所需的输出是(权重根据最大/最小值和返回数组值之间的值改变其位置):


这通常会通过一些简单的迭代一行一行地进行,但我似乎无法首先解决这个问题。单独排序然后匹配升序/降序)是不好的,因为返回数组必须取消排序。有什么想法吗?

那是个有趣的主意

看看这个:

import numpy as np
returns = np.array([0.01, 0.2, 0.05, -0.01, 0.3, -0.5])
weights = np.array([0.3, 0.25, 0.2, 0.15, 0.1, 0])

temp_dict = dict(zip(sorted(returns), sorted(weights)))

for index, el in enumerate(weights):
    weights[index] = temp_dict[returns[index]]

print(returns)
print(weights)
输出将是:

[ 0.01  0.2   0.05 -0.01  0.3  -0.5 ]
[0.15 0.25 0.2  0.1  0.3  0.  ]

首先,我们在“returns”中找到正确的顺序,然后将此顺序应用于排序后的“weights”。让我知道这是否有助于解决您的问题:)

这将打印所需的输出:

返回值:[0.01 0.2 0.05-0.01 0.3-0.5]

权重:[0.15 0.25 0.2 0.1 0.3 0]


看起来您需要使用
np.argsort
的倒数。为简单起见,它可以称为等级。因此,您可以获得
返回值的秩,如下所示:

_, ranks = np.unique(np.argsort(returns), return_index=True)
>>> ranks
array([2, 4, 3, 1, 5, 0], dtype=int64)
剩下的部分是:

>>> np.sort(weights)[ranks]
array([0.15, 0.25, 0.2 , 0.1 , 0.3 , 0.  ])
替代方法

在讨论之后,我发现逆argsort的赋值也可以通过以下方式完成:

a1 = np.argsort(returns)
a2 = np.argsort(weights)
weights[a1] = weights[a2] 
>>> weights
array([0.15, 0.25, 0.2 , 0.1 , 0.3 , 0.  ])

对不起,没有得到你想要做的。也许有一个输入示例、输出示例以及权重如何在其中发挥作用?编辑文章以提及所需的输出
>>> np.sort(weights)[ranks]
array([0.15, 0.25, 0.2 , 0.1 , 0.3 , 0.  ])
a1 = np.argsort(returns)
a2 = np.argsort(weights)
weights[a1] = weights[a2] 
>>> weights
array([0.15, 0.25, 0.2 , 0.1 , 0.3 , 0.  ])