python - 使用 numpy 索引数组索引 numpy 数组

标签 python arrays numpy indexing

<分区>

我有一个 3D numpy 数组 data 和另一个数组 pos 索引(索引本身就是一个 numpy 数组,这使得后一个数组成为一个二维数组) :

import numpy as np
data = np.arange(8).reshape(2, 2, -1)
#array([[[0, 1],
#    [2, 3]],
#
#  [[4, 5],
#    [6, 7]]])

pos = np.array([[1, 1, 0], [0, 1, 0], [1, 0, 0]])
#array([[1, 1, 0],
#       [0, 1, 0],
#       [1, 0, 0]])

我想使用 pos 中的索引选择和/或改变 data 中的元素。我可以使用 for 循环或列表理解来进行选择:

[data[tuple(i)] for i in pos]
#[6, 2, 4]
data[[i for i in pos.T]]
#array([6, 2, 4])

但这似乎不是一个numpy的方式。这个问题有向量化的 numpy 解决方案吗?

最佳答案

你可以将 pos 分成 3 个独立的数组和索引,就像这样——

>>> i, j, k = pos.T
>>> data[i, j, k]
array([6, 2, 4])

这里,pos中的列数对应于data的深度。只要您处理 3D 矩阵,获取 ijk 就不会比这更复杂。

在 python-3.6+ 上,你可以将其缩短为—

>>> data[[*pos.T]]
array([6, 2, 4])

关于python - 使用 numpy 索引数组索引 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50362262/

相关文章:

python - 以更短的方式定义 setter

c - 打印二维数组时出现 fatal error

python - np.reshape(x, (-1,1)) vs x[ :, np.newaxis]

python - 这是在 Pandas 中最快的分组方式吗?

python - django-rest-framework:全局限制对 GET 的请求?

Python SQLAlchemy 关系设置事件钩子(Hook)

c++ - 尝试使用两个不同的数组来提问和回答问题

python - 使用 numpy 数组作为 lambda 参数?

python - 如何在 Python 中使用带有 zeep 的 WSDL 的复杂类型

arrays - 从机器人框架中的列表中获取值