函数返回python中多维列表的元素

时间:2014-09-10 15:01:42

标签: python arrays numpy indexing

我正在尝试定义一个函数,该函数根据嵌套的索引列表返回多维变量的元素。我正在使用取决于多个维度的变量,例如:时间,海拔,纬度,经度。

现在制作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]]

非常感谢!

2 个答案:

答案 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]