我需要执行多维等效的操作,即从数组的每个“列”中选择一个元素:如果x
是数据数组,而idx
是索引数组,则{{ 1}}的轴小于idx
,并且x
的值指定要沿最后一个轴拾取idx
的哪个元素。结果应具有与x
相同的形状。
这是一个函数,它使用Python循环低效地执行此操作:
idx
问题:是否可以使用花哨索引或使用类似import numpy as np
def my_select(x, idx):
assert x.shape[:-1] == idx.shape
res = np.empty(idx.shape, dtype=x.dtype)
for pos, last in np.ndenumerate(idx):
res[pos] = x[pos + (last,)]
return res
的函数来更有效地做到这一点?
示例:以下示例显示了预期的输出:
np.take()
输出的第一行给出元素(0,0, 0 ),(0,1, 0 )和(0,2, 0 >>> x = np.arange(2 * 3 * 4).reshape(2, 3, 4)
>>> idx = np.array([[0, 0, 0], [1, 1, 1]])
>>> x
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]]])
>>> my_select(x, idx)
array([[ 0, 4, 8],
[13, 17, 21]])
的strong>),结果的第二行给出元素(1、0, 1 ),(1、1, 1 )和( 1、2, 1 )。前两个轴的索引仅迭代所有可能的值,最后一个索引(粗体)取自x
。