【问题标题】:"if" statement is not working for np.abs(np.max(f_5.all()))“如果”语句不适用于 np.abs(np.max(f_5.all()))
【发布时间】:2020-08-24 15:15:28
【问题描述】:
for ii in range (0,70):
    for jj in range (0,70):
        f_max = 0
        for k in range (0,50):
            if np.abs(np.max(f_5.all())) > f_max:
                f_max = f_5 #(+/-)
                idx=k

这里f_5 形状是(70,70,50),它的最大值在 360 左右,最小值在 230 左右。我想将最大值和点索引保存在 k 中。但是f_max 没有更新。

【问题讨论】:

  • 阅读“ndarray.all”的文档(包括示例)。你认为“所有”应该怎么做?
  • 如果我使用任何提供此 ValueError: 具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()
  • 您可以使用np.abs(f_5.max()) 找到最大值,然后将其与f_max 进行比较。如果合适,您可以使用idx = f_5.argmax()
  • 你不使用iijj,每次都对数组应用all。密切关注循环中发生的事情。练习更简单的一维列表。
  • 请更新您的代码的更完整的可重现版本,并对您想要实现的目标进行更多解释,以便我们提供更好的帮助。谢谢。

标签: python numpy data-manipulation


【解决方案1】:

如果我理解正确,您正在寻找这个而不需要循环:

idx_max = np.unravel_index(f_5.argmax(), f_5.shape)
idx = idx_max[2]
f_max = f_5[idx_max]

或等效的一种效率较低的方法(因为它搜索 max 并且还分别搜索 index ):

f_max = np.amax(f_5)
idx = np.argwhere(f_5==f_max)[0,2]

【讨论】:

  • 不要调用 max 和 argmax 两次。 Argmax 和索引
  • @MadPhysicist argmax() 返回扁平索引,而 OP 似乎关心沿轴的索引。虽然您可以使用 argmax 和索引,但这对 (70,70,50) 数组应该没有什么影响。谢谢你的观点。我正在相应地进行编辑。
  • @MadPhysicist 是的。但 OP 不希望 沿轴的最大值。它是沿最大轴的索引(在所有数组轴上)。它不同于沿同一轴的最大值。话虽如此,我更改了解决方案以反映您的观点。谢谢。
  • 感谢您的澄清。显然我不知道如何阅读:)
  • argwhere 解决方案(也是简单的 where)确实效率低下。它经过整个布尔掩码,在找到最大值所需的通过之后数组的大小。呈现它没有坏处,但它不是一个干净的方法。
【解决方案2】:

这将为您提供最大值的坐标:

f_5_max = np.amax(f_5)
max_coord = np.hstack(np.where(f_5 == f_5_max))

【讨论】:

  • 改用 argmax
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多