我有
>>> 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.]]])
答案 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.])