我最初有一个未排序的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
数组进行了一些处理,改变了一些值(第一列保持不变,行数保持不变)。最后,我想检索保持更改值的原始数组数组。所以我需要' unsort'它再次基于第一栏
到目前为止我的解决方案:
argsortTestList = argsortTest.tolist()
rangeX = np.array(xrange(6))
unsort_args = [argsortTestList.index(x) for x in rangeX]
unsorted = test_sorted[unsort_args]
我最后排序然后取消排序的原因是因为我在处理排序数组时获得了更好的性能。但是,由于所做的更改未反映在原始数组中,因此我必须再次取消它。
然而,' unsorting'解决方案太慢(大数据集:大约200K行)
答案 0 :(得分:4)
只做
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
,1
到1
,2
到3
,...由于第一列已排序,我们可以简单地使用高级索引来获取有序数组test[argsortTest]
。
现在,您想要做反向,即从右侧列向左移动,使索引0
转到0
,... 4
转到{{1 },3
到2
,...
为了使高级索引适用于左列,现在必须对右列进行排序
4
但由于此左栏恰好是comb[np.argsort(comb[:,1])]
# array([[0, 0],
# [1, 1],
# [4, 2],
# [2, 3],
# [3, 4],
# [5, 5]])
中右栏的argsort
,我们发现
comb
我希望这有助于理解这个想法...