【问题标题】:numpy find values of maxima pointed to by argmax [duplicate]numpy查找argmax指向的最大值[重复]
【发布时间】:2018-03-20 13:13:46
【问题描述】:

我有一个 3-d 数组。我使用 argmax 找到沿轴的最大值的索引。我现在如何使用这些索引来获得最大值? 第二部分:如何对 N-d 数组执行此操作?

例如:

u = np.arange(12).reshape(3,4,1)

In [125]: e = u.argmax(axis=2)
Out[130]: e
array([[0, 0, 0, 0],
   [0, 0, 0, 0],
   [0, 0, 0, 0]])

如果 u[e] 产生了预期的结果,那就太好了,但它不起作用。

【问题讨论】:

  • argmax(2) 没有意义,因为第三维只有一个元素。
  • u[e] 将为您提供第三轴上的最大值,但由于该轴上的每一行只有一个元素,因此它返回唯一元素的索引,即 0。
  • 我可能会混淆人们对“它会很好......”的评论。那不是问题。我的问题是“我现在如何使用 argmax 返回的索引来获取最大值?”还有,“如何推广到 N-d 的数组?”

标签: numpy


【解决方案1】:

argmax 沿轴的返回值不能简单地用作索引。它仅适用于一维情况。

In [124]: u = np.arange(12).reshape(3,4,1)
In [125]: e = u.argmax(axis=2)
In [126]: u.shape
Out[126]: (3, 4, 1)
In [127]: e.shape
Out[127]: (3, 4)

e 是 (3,4),但它的值仅索引 u 的最后一个维度。

In [128]: u[e].shape
Out[128]: (3, 4, 4, 1)

相反,我们必须为其他 2 个维度构建索引,即使用 e 广播的那些。例如:

In [129]: I,J=np.ix_(range(3),range(4))
In [130]: I
Out[130]: 
array([[0],
       [1],
       [2]])
In [131]: J
Out[131]: array([[0, 1, 2, 3]])

它们是 (3,1) 和 (1,4)。这些与 (3,4) e 和所需的输出兼容

In [132]: u[I,J,e]
Out[132]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

这种问题以前有人问过,所以可能应该标记为重复。您的最后一个维度是大小 1,因此 e 是全 0,这会分散读者对潜在问题的注意力(使用多维 argmax 作为索引)。

numpy: how to get a max from an argmax result

Get indices of numpy.argmax elements over an axis


假设你在最后一个维度上取了 argmax

In [156]: ij = np.indices(u.shape[:-1])
In [157]: u[(*ij,e)]
Out[157]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

或:

ij = np.ix_(*[range(i) for i in u.shape[:-1]])

如果轴在中间,则安排ij 元素和e 需要更多的元组摆弄。

【讨论】:

  • 同样的原则适用 - 生成可广播的索引以与 e 一起使用。 * 解包在某些情况下使这更容易。查看我的编辑。
【解决方案2】:

所以对于一般的N-d数组

dims = np.ix_(*[range(x) for x in u.shape[:-1]])
u.__getitem__((*dims,e))

你不能写u[*dims,e],那是语法错误,所以我认为你必须直接使用getitem

【讨论】:

  • u[(*ij,e)] 有效。 u[i,j]u[(i,j)] 相同,即有一个隐式元组。所以明确表示很好。
猜你喜欢
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 2021-08-17
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多