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

标签 python numpy multidimensional-array array-broadcasting matrix-indexing

例如,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) 相反,如果我们有批量提取上三角条目。

我们如何沿着批量维度广播元组索引?

最佳答案

获取元组并使用它们来索引最后两个暗淡 -

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
<小时/>

遮蔽方式

3D阵列案例

我们还可以使用掩码进行基于掩码的方式 -

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

二维数组案例

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

关于python - 如何沿批量维度广播 numpy 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58100302/

相关文章:

python - 计算任意维度数组的外积

python - 根据出现对数组元素进行分组,保持顺序,获取第一个和最后一个索引

multidimensional-array - Chapel 中稀疏数组的稀疏切片

python - 迭代多维数组并跟踪/执行迭代索引操作的最佳方法是什么

C:在 switch 中定义多维数组

python - 岭回归中的参数Alpha是什么?

python - 在python3中创建变量来分配多个值

python - TensorFlow 中的多维迭代器

python - Cython 比纯 Python 稍快或稍慢

python正则表达式匹配美元值