将Numpy数组的索引存储在变量中

9
我想将索引切片作为参数传递给一个函数:
def myfunction(some_object_from_which_an_array_will_be_made, my_index=[1:5:2,::3]):
    my_array = whatever(some_object_from_which_an_array_will_be_made)
    return my_array[my_index]

显然这样做是行不通的,而且在这种情况下可能有其他的方法来完成这个任务,但是假设我真的想要用一个变量来切片一个numpy数组,我该怎么做呢?

2个回答

14

np.lib.index_tricks有许多可以简化索引的函数(和类)。np.s_就是其中之一。它实际上是一个拥有__getitem__方法的类的实例,因此它使用了你想要的[]符号。

下面是一个使用它的示例:

In [249]: np.s_[1:5:2,::3]
Out[249]: (slice(1, 5, 2), slice(None, None, 3))

In [250]: np.arange(2*10*4).reshape(2,10,4)[_]
Out[250]: 
array([[[40, 41, 42, 43],
        [52, 53, 54, 55],
        [64, 65, 66, 67],
        [76, 77, 78, 79]]])

In [251]: np.arange(2*10*4).reshape(2,10,4)[1:5:2,::3]
Out[251]: 
array([[[40, 41, 42, 43],
        [52, 53, 54, 55],
        [64, 65, 66, 67],
        [76, 77, 78, 79]]])

注意它构造了与ajcr相同的切片元组。 _是IPython用于最后结果的临时变量。

要将这样的元组传递给函数,请尝试:

def myfunction(some_object_from_which_an_array_will_be_made, my_index=np.s_[:,:]):
    my_array = whatever(some_object_from_which_an_array_will_be_made)
    return my_array[my_index]
I = np.s_[1:5:2,::3]
myfunction(obj, my_index=I)

这听起来非常有趣 - 但是我该如何在我的例子中使用它呢?我想 np.s_var 不会起作用吧?即使这样做了,声明 var = [2:5],也会告诉我它是无效的语法。 - TheChymera
var=np.s[2:5]; foo(obj, my_index=var)。看我的示例。 - hpaulj
太棒了!但我相信你在最后一条评论中想说的是 var=np.s_[2:5]。而且它最终起作用的方式不是 my_array[_],而是 my_array[var] - TheChymera

4

一种方法是构建一个slice对象(或slice对象的元组)并将其传递给函数作为索引使用。

例如,索引符号

my_array[1:5:2, ::3]

等同于

my_array[slice(1,5,2), slice(None,None,3)]

那么你的函数可以变成:

def myfunction(some_object, my_index=(slice(1,5,2), slice(None,None,3))):
    my_array = whatever(some_object)
    return my_array[my_index]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接