从每一行中选择N个元素而不循环

时间:2019-04-27 04:12:35

标签: python numpy

给定形状为numpy的{​​{1}}数组items和形状为(D, N, Q)的另一个索引ids数组,如何制作新的数组{通过使用索引(N, P),形状为my_items的{​​1}},如下所示:

(D, N, P)

使用nq_ids魔法而不是使用任何显式循环?这是一个最小的示例:

# How can these loops be avoided?
my_items = np.zeros((D, N, P))
for n in range(N):
    for p in range(P):
        my_items[:, n, p] = items[:, n, ids[n, p]]

如果可能的话,我也想保留元素顺序。

1 个答案:

答案 0 :(得分:0)

现在应该可以正常工作,返回与循环完全相同的ndarray:

np.stack([np.take(items[:,i,:], ids[i, :], axis=1) 
          for i in range(ids.shape[0])], axis=2).transpose((0,2,1))

但是,@ hpaulj的方法更快,分别为23.5 µs和5 µs。所以用那个。