使用坐标列表切割numpy数组

Zio*_*fil 1 python numpy multidimensional-array

考虑M形状的numpy ndarray (比如说)(a,b,c)和坐标列表[(b0,c0),(b1,c1),...,(bn,cn)].

我想要以下矢量集合:[M[:,b0,c0],M[:,b1,c1],...,M[:,bn,cn]].如何通过列表理解实现这一目标?

编辑:我需要一个适用于任意数量维度的解决方案,即在案例(例如)中返回类似上面列表的列表M.shape = (a,b,c,d) and coordinates = [(b0,c0,d0),...,(bn,cn,dn)],以及更高维度的案例.

Wil*_*sem 5

如果你想要这些向量的列表,你可以简单地使用:

[M[:,bi,ci] for bi,ci in coordinates]
Run Code Online (Sandbox Code Playgroud)

coordinates你的名单当然在哪里:

coordinates = [(b0,c0),(b1,c1),...,(bn,cn)]
Run Code Online (Sandbox Code Playgroud)

编辑:如果您想要多变量切片,您可以__getitem__使用 aslice(None)和其余索引调用该方法:

[M.[(slice(None),*coord)] for coord in coordinates]
Run Code Online (Sandbox Code Playgroud)

对于;或者:

[M[(slice(None),)+coord] for coord in coordinates]
Run Code Online (Sandbox Code Playgroud)

对于其他版本。


Eri*_*ric 5

您不希望使用列表解析来执行此操作."花式索引"可以一次完成整个事情.我建议:

inds = [(b0,c0),(b1,c1),...,(bn,cn)]

#inds_array[0] = [b0, b1, b2, ...]
inds_array = np.moveaxis(np.array(inds), -1, 0)

M[np.index_exp[:] + tuple(inds_array)]
Run Code Online (Sandbox Code Playgroud)

演示:

>>> x, y, z = np.ogrid[:2,:4,:5]
>>> M = 100*x + 10*y + z
>>> M.shape
(2, 4, 5)
>>> inds = [(0, 0), (2, 1), (3, 4), (1, 2)]
>>> inds_array = np.moveaxis(np.array(inds), -1, 0); inds_array
array([[0, 2, 3, 1],
       [0, 1, 4, 2]])
>>> M[np.index_exp[:] + tuple(inds_array)]  # same as M[:, [0, 2, 3, 1], [0, 1, 4, 2]]
array([[  0,  21,  34,  12],
       [100, 121, 134, 112]])
Run Code Online (Sandbox Code Playgroud)