索引时如何解开元组?

时间:2019-07-15 11:05:18

标签: python numpy

我有一个非常高的尺寸张量,例如A,形状为5 X 10 X 100 X 200 X 50。 我有一个numpy表达式,它返回一个元组T,其中包含我要从A中提取的元素的索引。

我正在尝试:

A[*T]

它说:

  

无效的语法,您不能在此处使用加星号的表达式。

我该怎么办? PS:长的解决方案是:A [T [0],T [1],T [2],T [3],T [4]]

编辑:我刚刚发现没有必要这样做,因为它是自动完成的。示例:

a= np.random.rand(3,3)
a[np.triu_indices(3)]

表达式np.triu_indices(3)作为索引传递给a时将自动解压缩。 但是,回到我的问题上,这没有发生。具体来说,这是一个示例:

a = np.random.rand(100, 50, 14, 14)
a[:, :, np.triu_indices(14)].shape

据推测,最后一个位np.triu_indices(14)应该作用在最后两个轴上,如前面的示例中所示,但是没有发生,并且生成的形状很奇怪。为什么不打开包装?以及如何做到?

1 个答案:

答案 0 :(得分:2)

问题在于:

a[:, :, np.triu_indices(14)]

是您使用[...]slicetupletuple(slice, slice, tuple(np.ndarray, np.ndarray)))而不是单个tuple混合类型的元组作为tuple(slice, slice, np.ndarray, np.ndarray)的参数具有高级索引),例如a[(slice(None),) * 2 + np.triu_indices(14)] 。 这给您带来麻烦。我不会详细介绍您的情况。

将该行更改为:

a[(slice(None),) * 2 + np.triu_indices(14)].shape
# (100, 50, 105)

将解决您的问题:

(slice(None),) * 2 + np.triu_indices(14)

请注意,有两种重写方法:

(slice(None), slice(None), *np.triu_indices(14))

另一种方式可能是:

{
 name: 'Foo',
 path: '/foo'
 component: 'Foo.vue'
}