python - 使用列表列表进行 Numpy 索引

标签 python arrays numpy indexing

我有一个 numpy 的索引列表列表数组,但在使用它们时并没有完全达到想要的结果。

n = 3
a = np.array([[8, 1, 6],
              [3, 5, 7],
              [4, 9, 2]])
np.random.seed(7)
idx = np.random.choice(np.arange(n), size=(n, n-1))
# array([[0, 1],
#        [2, 0],
#        [1, 2]])

在这种情况下我想要:

  • 第 0 行的元素 0 和 1
  • 第 1 行的元素 2 和 0
  • 第 2 行的元素 1 和 2

我的列表有n sublists所有这些列表都具有相同的长度。 我希望每个子列表仅使用一次,而不是用于所有轴。

# Wanted result
# b = array[[8, 1],
#           [7, 3],
#           [9, 2]])

我可以实现这一点,但由于大量的重复和 reshape ,看起来相当麻烦。

# Possibility 1
b = a[:, idx]
# array([[[8, 1],   | [[3, 5],   |  [[4, 9],
#         [6, 8],   |  [7, 3],   |   [2, 4],
#         [1, 6]],  |  [5, 7]],  |   [9, 2]])
b = b[np.arange(n), np.arange(n), :]

# Possibility 2
b = a[np.repeat(range(n), n-1), idx.ravel()]
# array([8, 1, 7, 3, 9, 2])
b = b.reshape(n, n-1)

还有更简单的方法吗?

最佳答案

您可以在此处使用np.take_along_axis:

np.take_along_axis(a, idx, 1)

array([[8, 1],
       [7, 3],
       [9, 2]])

或使用广播:

a[np.arange(a.shape[0])[:,None], idx]

array([[8, 1],
       [7, 3],
       [9, 2]])

请注意,您使用 integer array indexing在这里,您需要使用 idx 指定要在哪些轴和行上建立索引。

关于python - 使用列表列表进行 Numpy 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60156337/

相关文章:

python - 如何使用 ElementTree 将未转义的字符串写入 XML 元素?

python - 使用 pandas 重新分配项目会给出错误的结果

arrays - 为什么元胞数组中的尾随逗号是有效的 Matlab 语法?

java - Java中的空数组对象创建

javascript - 如何根据单词作为键分隔符读取文本文件的 block ?

python - 将重复参数传递给 Numpy 向量化函数的最佳方法

python - 如何在 python 中找到二维数组的临界点?

python - matplotlib 动画绘图不会使用 blit 更新轴上的标签

python - 在两个类之间传递参数

python - 具有转换的重复数组