Python 按另一个1-D数组对N-D numpy数组排序

Python 按另一个1-D数组对N-D numpy数组排序,python,arrays,sorting,numpy,Python,Arrays,Sorting,Numpy,通过对这个问题()的回答,我学会了如何根据另一个numpy数组b的值对多维numpy数组a进行排序,而无需创建太多额外的数组 但是,numpy.rec.fromarrays([a,b])仅当数组a和b具有相同的形状时才起作用。我的b数组是一维数组,但a数组是N-D数组(未指定N)。根据一维数组b的值,在特定轴中对a数组进行排序,这是一种很好的方法(也是有效的)吗 使用np.take和轴关键字参数: >>> a = np.arange(2*3*4).reshape(2, 3, 4

通过对这个问题()的回答,我学会了如何根据另一个numpy数组
b
的值对多维numpy数组
a
进行排序,而无需创建太多额外的数组


但是,
numpy.rec.fromarrays([a,b])
仅当数组
a
b
具有相同的形状时才起作用。我的
b
数组是一维数组,但
a
数组是N-D数组(未指定N)。根据一维数组
b
的值,在特定轴中对
a
数组进行排序,这是一种很好的方法(也是有效的)吗

使用
np.take
关键字参数:

>>> 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
应该是你的第一选择