4

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

但是,numpy.rec.fromarrays([a, b])仅当数组ab具有相同形状时才有效。我的b数组是一维数组,但a数组是 ND 数组(未指定 N)。a通过一维数组的值在特定轴之间对数组进行排序是一种很好的方法(并且有效)b吗?

4

1 回答 1

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

于 2013-09-27T19:41:20.237 回答