numpy 根据其他二维数组的秩对二维数组排序

91zkwejq  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(273)

我有两个二维numpy数组:

import numpy as np
import scipy.stats.rankdata

arr_data = np.array( [[0.3, 0.1, 0.7, 0.5], [0.1, 0.5, 0.4, 0.07]] )
weights = np.array( [[0.05, 0.1, 0.35, 0.5], [0.2, 0.4, 0.1, 0.3]] )

我需要根据一个共同的排序对它们进行排序,共同的排序是从axis=1沿着第一个数组中的值生成的:

ranks = scipy.stats.rankdata(arr_data, axis=1).astype(int)
print('data', arr_data)
print('ranks',ranks)

获得的排名如下:

[[2 1 4 3]
 [2 4 3 1]]

我被如何获得下面的排序数组所困扰:

for arr_data: [[0.1, 0.3, 0.5, 0.7], [0.07, 0.1, 0.4, 0.5]]
for weights: [[0.1, 0.05, 0.5, 0.35], [0.3, 0.2, 0.1, 0.4]]

也就是说,我的权重是基于数据数组排序的。最终,我想把数据乘以它们对应的权重,保持数据数组中排序值的顺序。在我的项目中,我有非常大的数据集,所以我想避免Python列表和循环。

kmbjn2e3

kmbjn2e31#

原来有一个优雅的解决方案:

import numpy as np

data = np.array([[0.3, 0.1, 0.7, 0.5], [0.1, 0.5, 0.4, 0.07]])
weights = np.array([[0.05, 0.1, 0.35, 0.5], [0.2, 0.4, 0.1, 0.3]])

ranks = np.argsort(data, axis=1)
sorted_data = np.take_along_axis(data, ranks, axis=1)
sorted_weights = np.take_along_axis(weights, ranks, axis=1)
print('data\n', data)
print('weights\n', weights)
print("sorted data\n",sorted_data)
print("sorted weights\n", sorted_weights)

相关问题