gpt4 book ai didi

arrays - 给定 argsort 如何取消对 np 数组的排序

转载 作者:行者123 更新时间:2023-12-01 23:31:24 26 4
gpt4 key购买 nike

我最初有一个未排序的 np 数组数组

test = np.array([['A', 'A', 'B', 'E', 'A'],
['B', 'E', 'A', 'E', 'B'],
['C', 'D', 'D', 'A', 'C'],
['B', 'D', 'A', 'C', 'A'],
['B', 'A', 'E', 'A', 'E'],
['C', 'D', 'C', 'E', 'D']])

要根据第一列对数组进行排序:
argsortTest = test[:,0].argsort()
test_sorted = test[argsortTest]

test_sorted:
[['A' 'A' 'B' 'E' 'A']
['B' 'E' 'A' 'E' 'B']
['B' 'D' 'A' 'C' 'A']
['B' 'A' 'E' 'A' 'E']
['C' 'D' 'D' 'A' 'C']
['C' 'D' 'C' 'E' 'D']]

我在 test_sorted 上做了一些处理数组更改了一些值(第一列保持不变,行数不变)。最后,我想检索保留更改值的原始数组数组。所以我需要根据第一列再次“取消排序”

到目前为止我的解决方案:
argsortTestList = argsortTest.tolist()
rangeX = np.array(xrange(6))
unsort_args = [argsortTestList.index(x) for x in rangeX]
unsorted = test_sorted[unsort_args]

我进行排序然后最后取消排序的原因是因为我在处理排序数组时获得了更好的性能。但是,由于所做的更改未反射(reflect)在原始数组中,因此我必须再次对其进行取消排序。

然而,'unsorting' 解决方案太慢(大数据集:大约 200K 行)

最佳答案

做就是了

b = np.argsort(argsortTest)
test_sorted[b]

# Output
# array([['A', 'A', 'B', 'E', 'A'],
# ['B', 'E', 'A', 'E', 'B'],
# ['C', 'D', 'D', 'A', 'C'],
# ['B', 'D', 'A', 'C', 'A'],
# ['B', 'A', 'E', 'A', 'E'],
# ['C', 'D', 'C', 'E', 'D']],
# dtype='|S1')

说明

考虑以下数组
comb = np.column_stack((np.arange(argsortTest.size),argsortTest))
comb

# array([[0, 0],
# [1, 1],
# [2, 3],
# [3, 4],
# [4, 2],
# [5, 5]])

左列是 test的索引右边是 argsort 的结果,这意味着索引 0转至 0 , 11 , 23 , ... 由于第一列已排序,我们可以简单地使用高级索引来获取有序数组 test[argsortTest] .

现在,你想要做相反的事情,即从右列到左列,这样索引 0转至 0 , ... 43 , 24 , ...
为了使高级索引适用于左列,现在必须对右列进行排序
comb[np.argsort(comb[:,1])]

# array([[0, 0],
# [1, 1],
# [4, 2],
# [2, 3],
# [3, 4],
# [5, 5]])

但由于这个左列正是 argsort comb 中右列的我们发现
test = test_sorted[ np.argsort(argsortTest) ]

我希望这有助于理解这个想法......

关于arrays - 给定 argsort 如何取消对 np 数组的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34159608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com