如何沿批量维度广播 numpy 索引?

How to broadcast numpy indexing along batch dimensions?

例如,np.array([[1,2],[3,4]])[np.triu_indices(2)] 的形状为 (3,),是上三角条目的展平列表。但是,如果我有一批 2x2 矩阵:

foo = np.repeat(np.array([[[1,2],[3,4]]]), 30, axis=0)

我想获得每个矩阵的上三角指数,天真的尝试是:

foo[:,np.triu_indices(2)]

然而,这个对象实际上是 (30,2,3,2) 的形状(与 (30,3) 相反,如果我们批量提取上三角条目,我们可能会期望。

我们如何在批量维度上广播元组索引?

获取元组并使用它们对最后两个 dims 进行索引 -

r,c = np.triu_indices(2)
out = foo[:,r,c]

或者,带有 Ellipsis 的单行代码适用于 3D2D 数组 -

foo[(Ellipsis,)+np.triu_indices(2)]

它同样适用于 2D 数组 -

out = foo[r,c] # foo as 2D input array

屏蔽方式

三维数组案例

我们也可以使用掩码作为基于 masking 的方式 -

foo[:,~np.tri(2,k=-1, dtype=bool)]

二维数组大小写

foo[~np.tri(2,k=-1, dtype=bool)]