我有一个非常高的尺寸张量,例如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)
应该作用在最后两个轴上,如前面的示例中所示,但是没有发生,并且生成的形状很奇怪。为什么不打开包装?以及如何做到?
答案 0 :(得分:2)
问题在于:
a[:, :, np.triu_indices(14)]
是您使用[...]
和slice
和tuple
(tuple(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'
}