【问题标题】:How do I get the minimum of certain elements of an array with Python?如何使用 Python 获取数组中某些元素的最小值?
【发布时间】:2018-04-22 17:42:15
【问题描述】:

我需要知道迭代数组中某些元素的数据的最小元素。

我有三个数组dist、Q和顶点:

dist = [  0.  inf  inf  inf  inf]
vertex = [2 4 5 7 8]
Q = [2 4 5 7 8]

dist 数组是顶点值。每次迭代 Q 减小并且 dist 具有不同的值。例如:

第一次迭代:

dist = [  0.  inf  inf  inf  inf]
vertex = [2 4 5 7 8]
Q = [2 4 5 7 8]

第二次迭代:

dist   = [  0.  4.  2.  2.  1.]
vertex = [2 4 5 7 8]
Q      = [4 5 7 8]

第三次迭代

dist =   [ 0.  4.  2.  2.  1.]
vertex = [2 4 5 7 8]
Q =      [4 5 7]

这个想法是找到 dist 的最小值,但只找到 vertexQ 的可用值。在第一次迭代中,最小值为 0,因为它们都在 Q 中。在第二次迭代中,最小的 1,即 vertex 中的 8,因为在 Q 中,dist 中没有值为 0 的 4强>。

这是 Dijkstra 算法的一部分,它在其中找到 Q 值的最小值。在伪代码中它将是:

u ← vertex in Q with min dist[u]    // Node with the least distance

我只是在使用 Numpy 库。

到目前为止我的解决方案:

    min = np.inf
    u = 0
    for q in Q:
        if dist[self.vertex == q] <= min:
            min = dist[self.vertex == q]
            u = q

【问题讨论】:

  • 好的,谢谢您的建议

标签: python python-3.x numpy dijkstra


【解决方案1】:

小技巧:如果顶点不在Q中,则添加∞:

>>> dist =   [ 0.,  4.,  2.,  2.,  1.]
>>> vertex = [2, 4, 5, 7, 8]
>>> Q =      [4, 5, 7]

>>> vertex_mask = np.array([0 if x in Q else float('inf') for x in vertex])
>>> np.min(vertex_mask+dist)
2.0

【讨论】:

  • 虽然我怕它有同样的算法复杂度
  • Q变成set(),复杂度会从O(m*n)到O(m log n)
猜你喜欢
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2020-04-16
  • 2021-07-08
  • 1970-01-01
相关资源
最近更新 更多