【问题标题】:How to place elements of a NumPy array in a desired order using 2D array of indices [duplicate]如何使用二维索引数组按所需顺序放置 NumPy 数组的元素 [重复]
【发布时间】:2019-10-30 13:19:00
【问题描述】:

我有一个格式为

的 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 = [[[a4, a5, a6],
      [a1, a2, a3],
      [a7, a8, a9]],

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

【问题讨论】:

  • 根据重复目标,您的示例输出可以通过a[np.arange(2)[:,None], M] 实现,其中aM 都是NumPy 数组。

标签: python numpy indexing


【解决方案1】:

您可以使用列表推导式 -

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]

这将比对较大数组的列表推导更快。

【讨论】:

  • 感谢您的回复!这速度快吗?我真正的数组是 700,000 维的,而不仅仅是本例中的二维。那个 for 循环够好吗?
  • 这是一个列表理解,所以应该非常快。
  • "但这比列表理解要慢得多" - 对于小型数组,这可能是正确的,但请检查数组的时间,比如大 100 倍。跨度>
  • @Georgy 你说得对,它要快得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多