如何沿批量维度广播 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
的单行代码适用于 3D
和 2D
数组 -
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)]
例如,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
的单行代码适用于 3D
和 2D
数组 -
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)]