考虑形状(例如)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)]
以及更高维度的案例同样。
答案 0 :(得分: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)]
演示:
>>> 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]])
答案 1 :(得分:1)
如果您想要这些矢量的列表,您只需使用:
[M[:,bi,ci] for bi,ci in coordinates]
其中coordinates
当然是您的清单:
coordinates = [(b0,c0),(b1,c1),...,(bn,cn)]
编辑:如果您想要多变量切片,可以使用__getitem__
和其余索引调用slice(None)
方法:
[M.__getitem__((slice(None),*coord)) for coord in coordinates]
for python-3.5;或者:
[M.__getitem__((slice(None),)+coord) for coord in coordinates]
其他python版本。