如何在给定argsort的情况下取消分配np数组

时间:2015-12-08 15:23:13

标签: arrays numpy

我最初有一个未排序的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行)

1 个答案:

答案 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转到01123,...由于第一列已排序,我们可以简单地使用高级索引来获取有序数组test[argsortTest]

现在,您想要做反向,即从右侧列向左移动,使索引0转到0,... 4转到{{1 },32,... 为了使高级索引适用于左列,现在必须对右列进行排序

4

但由于此左栏恰好是comb[np.argsort(comb[:,1])] # array([[0, 0], # [1, 1], # [4, 2], # [2, 3], # [3, 4], # [5, 5]]) 中右栏的argsort,我们发现

comb

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