用另一个1-D数组对N-D numpy数组进行排序

时间:2013-09-27 19:04:51

标签: python arrays sorting numpy

从这个问题(Sort a numpy array by another array, along a particular axis, using less memory)的答案中,我学会了如何通过另一个numpy数组a的值对多维numpy数组b进行排序,而不会创建太多额外的数组。

但是,numpy.rec.fromarrays([a, b])仅在数组ab具有相同形状时才有效。我的b数组是1-D数组,但a数组是N-D数组(未指定N)。通过1-D数组a的值对特定轴中的b数组进行排序是一种很好的方法(也是有效的)?

1 个答案:

答案 0 :(得分:4)

np.takeaxis关键字参数一起使用:

>>> a = np.arange(2*3*4).reshape(2, 3, 4)
>>> a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>> b = np.arange(3)
>>> np.random.shuffle(b)
>>> b
array([1, 0, 2])
>>> np.take(a, b, axis=1)
array([[[ 4,  5,  6,  7],
        [ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[16, 17, 18, 19],
        [12, 13, 14, 15],
        [20, 21, 22, 23]]])

如果你想使用花哨的索引,你只需要用足够的空切片填充索引元组:

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

       [[16, 17, 18, 19],
        [12, 13, 14, 15],
        [20, 21, 22, 23]]])

或者在更一般的环境中:

>>> axis = 1
>>> idx = (slice(None),) * axis + (b,)
>>> a[idx]
array([[[ 4,  5,  6,  7],
        [ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[16, 17, 18, 19],
        [12, 13, 14, 15],
        [20, 21, 22, 23]]])

np.take应该是你的第一选择。