【发布时间】:2021-11-10 11:07:10
【问题描述】:
问题:
-
我有一个 4 维的 numpy 数组:
x = np.arange(1000).reshape(5, 10, 10, 2 )如果我们打印它:
-
我想在第二个轴上找到数组的 6 个最大值的索引,但仅在最后一个轴上的第 0 个元素(图中的红色圆圈图片):
indLargest2ndAxis = np.argpartition(x[...,0], 10-6, axis=2)[...,10-6:]这些索引的形状符合预期的 (5,10,6)。
-
我想获得 第二个轴上这些索引的数组值,但现在是最后一个轴上的第一个元素(图像中的黄色圆圈)。它们的形状应为 (5,10,6)。如果没有矢量化,这可以通过以下方式完成:
np.array([ [ [ x[i, j, k, 1] for k in indLargest2ndAxis[i,j]] for j in range(10) ] for i in range(5) ])但是,我想实现它的矢量化。我尝试使用以下索引进行索引:
x[indLargest2ndAxis, 1]但我得到
IndexError: index 5 is out of bounds for axis 0 with size 5。 如何以矢量化方式管理此索引组合?
【问题讨论】:
-
np.argpartition"返回一个与a形状相同的索引数组,以分区顺序沿给定轴索引数据。"所以第一次天真的尝试是使用省略号x[..., indLargest2ndAxis, 1]。也就是说,我不太清楚“显示最后一个轴中第一个元素的值 [...]”是什么意思。它只是另一片吗?在这种情况下,花式索引(高级索引)。 -
另请注意
np.argpartition(x[..., 0], 6, ...)可能无法达到您的预期;它将产生对x[...,0]进行分区的索引,这样 - 沿着索引为 2 的轴 -x[..., 6, 0]处于其排序位置,它之前的元素较小,之后的元素较大。如果x[...,6,0]确实是数组的(唯一的)第 6 大值,您可以通过x[..., 6:, 0]检索 6 个最大的元素;否则,您可能无法始终获得 6 个最大值。 -
@FirefoxMetzger 啊,我把最大和最小搞混了,我想现在
indLargest2ndAxis应该包含x[...,0]沿第二轴的6 个最大值的索引。 -
@FirefoxMetzger 是的,我的问题是如何进行这种高级索引。
indLargest2ndAxis保存x的 0、1 和 2 轴的索引,而第 3 轴应该是1。我不明白为什么直接写x[indLargest2ndAxis, 1]不起作用,但x[..., indLargest2ndAxis, 1]会产生结果。当你写...时会发生什么?而且,这个表达式并没有给出我想要的结果:它的形状为 (5, 10, 5, 10, 6),但我想要 (5, 10, 6),其值由图片。
标签: python numpy multidimensional-array indexing numpy-slicing