Numpy:"添加"索引和冒号

时间:2016-01-17 12:11:48

标签: python numpy

我有

>>> foo = np.zeros((3,3,3))
>>> foo[1,2,1] = 1
>>> idx = 1,2

我想得到相当于

>>> foo[1,2,:]
array([ 0.,  1.,  0.])

使用idx(迭代idx)。我试过的两种方法都没有成功:

>>> foo[idx, :]
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  1.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])
>>> foo[((idx,)+(slice(None),))]
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  1.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

2 个答案:

答案 0 :(得分:5)

使用foo[idx]。阅读以下内容,了解我是如何达到此目的的。

foo[1,2,:]实际上是:

In [379]: foo[(1,2,slice(None))]
Out[379]: array([ 0.,  1.,  0.])

Python解释器将1,2,:转换为此元组,并将其传递给foo.__getitem__方法。

所以我们必须找到构建元组的正确方法。一个是:

In [380]: tuple(idx)+(slice(None),)
Out[380]: (1, 2, slice(None, None, None))

导致:

In [381]: foo[tuple(idx)+(slice(None),)]
Out[381]: array([ 0.,  1.,  0.])

其实我不需要tuple来电,idx已经是一个元组

In [386]: idx
Out[386]: (1, 2)
In [387]: idx+(slice(None),)
Out[387]: (1, 2, slice(None, None, None))

如果tuple([1,2])作为列表初始化,我需要idx

实际上,解决方案更简单。由于我们使用:作为最后一个维度,因此我们可以省略它。由于idx是元组,因此它已经为前两个维度编制索引。

In [394]: foo[idx]
Out[394]: array([ 0.,  1.,  0.])

这对电话可以提供一些清晰度:

In [396]: foo[(1,2)]
Out[396]: array([ 0.,  1.,  0.])
In [397]: foo[[1,2]]
Out[397]: 
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  1.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

答案 1 :(得分:2)

>>> foo[idx + (slice(None),)]
array([ 0.,  1.,  0.])