我正在尝试定义一个函数,该函数根据嵌套的索引列表返回多维变量的元素。我正在使用取决于多个维度的变量,例如:时间,海拔,纬度,经度。
现在制作3D(例如,时间,海拔高度和纬度):
x = np.arange(125).reshape(5,5,5)
如果我现在想要前4个步骤,前3个高度等级和前2个纬度,我可以做几件事:
x[[0,1,2,3],:,:][:,[0,1,2],:][:,:,[0,1]]
或
x[ [[[0]],[[1]],[[2]],[[3]]],[[0],[1],[2]],[0,1]]
或
x[np.ix_([0,1,2,3],[0,1,2],[0,1])]
但我想要的是一个功能,让我回到像
这样的元素def get_elements( x, l )
其中l
是索引列表
l = [[0,1,2,3],[0,1,2],[0,1]]
这个功能怎么样?最后一个选择非常接近但x[np.ix_(l)]
给了我一个IndexError
。
此外,有机会保持尺寸不变,这将是很好的。例如,使用此伪代码中的所有时间步骤:
l = [[:],[0,1,2],[0,1]]
非常感谢!
答案 0 :(得分:1)
请注意np.ix_
的签名:
np.ix_(*args)
因此您需要'展开'l
:
x[np.ix_(*l)]
查看ix_
的代码。请注意,它会执行迭代args
之类的操作,并返回一个元组。另请查看np.lib.index_tricks
中的其他函数。
通常,如果列表在索引时给您带来问题,请检查是否需要使用元组。同时熟悉slice
。
答案 1 :(得分:1)
要直接回答关于创建函数的问题,在构建函数时使用列表,但是,您需要使用np.ix_
函数:
def get_elements(x, l):
return x[np.ix_(*l)]
但是,我想你想要这个:
>>> x[:4,:3,:2]
array([[[ 0, 1],
[ 5, 6],
[10, 11]],
[[25, 26],
[30, 31],
[35, 36]],
[[50, 51],
[55, 56],
[60, 61]],
[[75, 76],
[80, 81],
[85, 86]]])
它返回与此相同:
x[np.ix_([0,1,2,3],[0,1,2],[0,1])]
这里有一个很好的答案:https://stackoverflow.com/a/24713353/541136
您可以为切片对象命名并将其传递给它们:
>>> first_four_slice = slice(None, 4)
>>> first_three_slice = slice(None, 3)
>>> first_two_slice = slice(None, 2)
>>> x[first_four_slice, first_three_slice, first_two_slice]
您可以将它们全部打包在一个变量中:
>>> slice_tuple = first_four_slice, first_three_slice, first_two_slice
>>> x[slice_tuple]
并获得所有“时间步骤”(即,从该维度获得所有内容),如下所示:
>>> all_slice = slice(None)
>>> x[all_slice, first_three_slice, first_two_slice]