【问题标题】:selecting certain indices in Numpy ndarray using another array使用另一个数组在 Numpy ndarray 中选择某些索引
【发布时间】:2020-10-12 13:24:12
【问题描述】:

我正在尝试在 3D 数组中标记最大值的值和索引,在第三个轴上获取最大值。 现在这在较低的维度上会很明显:​​

argmaxes=np.argmax(array)
maximums=array[argmaxes]

但是 NumPy 不能正确理解高于 1D 的第二种语法。 假设我的 3D 数组具有形状 (8,8,250)。 argmaxes=np.argmax(array,axis=-1)将返回一个 (8,8) 数组,其中的数字介于 0 到 250 之间。现在我的预期输出是一个 (8,8) 数组,其中包含第三维中的最大数字。我可以使用maxes=np.max(array,axis=-1) 来实现这一点,但这会重复两次相同的计算(因为我需要值和索引来进行以后的计算) 我也可以只做一个粗略的嵌套循环:

for i in range(8):
   for j in range(8):
      maxes[i,j]=array[i,j,argmaxes[i,j]]

但是有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python numpy numpy-ndarray


    【解决方案1】:

    您可以使用高级索引。当 shape 为 (8,8,3) 时,这是一个更简单的情况:

    arr = np.random.randint(99, size=(8,8,3))
    x, y = np.indices(arr.shape[:-1])
    arr[x, y, np.argmax(array,axis=-1)]
    

    示例运行:

    >>> x
    array([[0, 0, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 1, 1, 1],
           [2, 2, 2, 2, 2, 2, 2, 2],
           [3, 3, 3, 3, 3, 3, 3, 3],
           [4, 4, 4, 4, 4, 4, 4, 4],
           [5, 5, 5, 5, 5, 5, 5, 5],
           [6, 6, 6, 6, 6, 6, 6, 6],
           [7, 7, 7, 7, 7, 7, 7, 7]])
    >>> y
    array([[0, 1, 2, 3, 4, 5, 6, 7],
           [0, 1, 2, 3, 4, 5, 6, 7],
           [0, 1, 2, 3, 4, 5, 6, 7],
           [0, 1, 2, 3, 4, 5, 6, 7],
           [0, 1, 2, 3, 4, 5, 6, 7],
           [0, 1, 2, 3, 4, 5, 6, 7],
           [0, 1, 2, 3, 4, 5, 6, 7],
           [0, 1, 2, 3, 4, 5, 6, 7]])    
    >>> np.argmax(arr,axis=-1)    
    array([[2, 1, 1, 2, 0, 0, 0, 1],
           [2, 2, 2, 1, 0, 0, 1, 0],
           [1, 2, 0, 1, 1, 1, 2, 0],
           [1, 0, 0, 0, 2, 1, 1, 0],
           [2, 0, 1, 2, 2, 2, 1, 0],
           [2, 2, 0, 1, 1, 0, 2, 2],
           [1, 1, 0, 1, 1, 2, 1, 0],
           [2, 1, 1, 1, 0, 0, 2, 1]], dtype=int64)
    

    这是一个数组的可视化示例,有助于更好地理解它:

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 2018-10-10
      • 2011-07-27
      • 2020-06-11
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多