Python 如何使用二维索引数组按所需顺序放置NumPy数组的元素

Python 如何使用二维索引数组按所需顺序放置NumPy数组的元素,python,numpy,indexing,Python,Numpy,Indexing,我有一个表单的NumPy数组 a = [[[a1, a2, a3], [a4, a5, a6], [a7, a8, a9]], [[b1, b2, b3], [b4, b5, b6], [b7, b8, b9]]] M = [[1, 0, 2], [1, 2, 0]] 和表单的另一个数组 a = [[[a1, a2, a3], [a4, a5, a6], [a7, a8, a9]], [

我有一个表单的NumPy数组

a = [[[a1, a2, a3],
      [a4, a5, a6],
      [a7, a8, a9]],

     [[b1, b2, b3],
      [b4, b5, b6],
      [b7, b8, b9]]]
M = [[1, 0, 2],
     [1, 2, 0]]
和表单的另一个数组

a = [[[a1, a2, a3],
      [a4, a5, a6],
      [a7, a8, a9]],

     [[b1, b2, b3],
      [b4, b5, b6],
      [b7, b8, b9]]]
M = [[1, 0, 2],
     [1, 2, 0]]
有没有一种简单的方法可以使用第二个数组中的索引对第一个数组重新排序?所以最后第一个会变成:

a = [[[a4, a5, a6],
      [a1, a2, a3],
      [a7, a8, a9]],

     [[b4, b5, b6],
      [b7, b8, b9],
      [b1, b2, b3]]]

您可以使用列表理解-

b = [[a[i][j] for j in m] for i, m in enumerate(M)]
您还可以使用以下选项:

b = [i[j] for i, j in zip(a, M)]
由于您的阵列是numpy阵列,但速度会较慢。无论出于何种目的,列表理解都非常快

如果不想一次加载整个列表,可以使用生成器:

b = ([a[i][j] for j in m] for i, m in enumerate(M))
但这只能迭代一次

您还可以使用numpy方法:

b = a[np.arange(len(M))[:,None],M]

这将比大型阵列的列表理解速度更快。

感谢您的回复!这么快吗?我的真实a数组是700000维的,而不是像本例中那样的二维数组。这对于循环来说足够好吗?它是一个列表理解,所以应该非常快。“但是这比列表理解慢得多”-对于小数组,这可能是正确的,但是检查数组的时间,比如,100倍大。@Georgy你是对的,根据复制目标,您的示例输出可以通过
a[np.arange(2)[:,None],M]
实现,其中
a
M
都是NumPy数组。