使用较小的N-D阵列按列对N-D numpy数组进行排序

时间:2015-12-07 11:58:47

标签: python arrays sorting numpy

我理解通过Sort N-D numpy array by another 1-D array使用花式索引,我可以执行以下c = a[:, :, b] b定义我想按列排序的顺序

>>> a = np.array([[[ 0,  1], [ 2,  3]],
                  [[ 4,  5], [ 6,  7]],
                  [[ 8,  9], [10, 11]]])
>>> b = np.array([1, 0])
>>> c = a[:, :, b]
>>> c
array([[[ 1,  0],
        [ 3,  2]],

       [[ 5,  4],
        [ 7,  6]],

       [[ 9,  8],
        [11, 10]]])

现在,我向b增加了b2a,与我>>> b2 = np.array([[1, 0], [0, 1], [1, 0]]) >>> c2 = ? >>> c2 array([[[ 1, 0], [ 3, 2]], [[ 4, 5], [ 6, 7]], [[ 9, 8], [11, 10]]])

中每组2x2的排序方式相对应
c2 = ?

我有一组更大的输入,我有一个函数返回一个类似于' b2'的数组。它为我提供了我应该获得的信息。因此,我可以知道我应该填写b=[10,11,14,9]; a=[13,10,18,11]; tic c = a > b; for i=1:14166133 if any(c) end end toc 以获得所需的结果吗?

3 个答案:

答案 0 :(得分:5)

这是花式索引 -

的一种方法
(a[np.arange(a.shape[0])[:,None],:,b2]).transpose(0,2,1)

示例运行 -

In [191]: a
Out[191]: 
array([[[7, 8, 5, 2, 0],
        [6, 7, 0, 7, 1],
        [7, 6, 5, 4, 0]],

       [[8, 0, 5, 5, 7],
        [4, 3, 4, 0, 1],
        [8, 6, 3, 2, 4]],

       [[3, 2, 7, 3, 7],
        [4, 3, 0, 1, 5],
        [4, 3, 7, 8, 7]]])

In [192]: b2
Out[192]: 
array([[1, 2, 4, 3, 0],
       [4, 2, 0, 1, 3],
       [1, 3, 4, 0, 2]])

In [193]: (a[np.arange(a.shape[0])[:,None],:,b2]).transpose(0,2,1)
Out[193]: 
array([[[8, 5, 0, 2, 7],
        [7, 0, 1, 7, 6],
        [6, 5, 0, 4, 7]],

       [[7, 5, 8, 0, 5],
        [1, 4, 4, 3, 0],
        [4, 3, 8, 6, 2]],

       [[2, 3, 7, 3, 7],
        [3, 1, 5, 4, 0],
        [3, 8, 7, 4, 7]]])

答案 1 :(得分:1)

如果没有人找到纯粹的花式索引解决方案,这里就是循环第一轴的解决方案:

    if random_string == 5:
        sys.stdout.write(my_random_string(2))
        sys.stdout.flush()
        time.sleep(0.1)
        for _ in range(2):
            sys.stdout.write('\b \b')
            sys.stdout.flush()
            time.sleep(0.1)

答案 2 :(得分:1)

@Divakar's解决方案类似,但没有transpose

In [259]: I,J, K = np.ogrid[:3,:2,:2]

In [260]: a[I, J, b[:,None,:]]
Out[260]: 
array([[[ 1,  0],
        [ 3,  2]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 9,  8],
        [11, 10]]])

我使用ogrid(或np.ix_)作为生成2个3d阵列的紧凑方式,与b[:,None,:]一起广播以生成一组(3,2,2)个索引

与完整Nones相当的是:

a[np.arange(3)[:,None,None], np.arange(2)[None,:,None], b[:,None,:]]

(这使b选择沿第一轴和最后一轴的项目更清楚)

要查看完整的广播索引数组,请打印:

 np.broadcast_arrays(I,J,b[:,None,:])