【问题标题】:Finding the minimum value of an array subject to an index of another array and values from another one查找受另一个数组的索引和另一个数组的值影响的数组的最小值
【发布时间】:2018-08-29 19:02:25
【问题描述】:

我有一个名为 dist 的特定大小 n x n 的方形数组,一个名为 particion 的大小为 m<n 的向量,其索引从 0n,另一个名为 incidencia 的大小m。一切都使用 NumPy 存储。

我想找到的是dist 的最小值,它符合两个条件并将参数作为向量捕获。这是从 C++ 翻译成 python 的粗略代码:

num = len(particion)
a = [100] * 2
mini = dist_max
for i in range(num):
    pi = particion[i]
    for j in range(num):
        pj = particion[j]
        if (dist[pi,pj] <= mini) & ((incidencia[i] < 2) & (incidencia[j] < 2)):
            mini = dist[pi][pj]
            a[0] = i
            a[1] = j

我觉得这不是找到最小值的最佳方法,因为这个函数需要太多时间来计算,即使在 C++ 中也是如此。有没有更好的办法?更“python-eske”的方式?

【问题讨论】:

  • 你能用 NumPy 吗?
  • 这将是堆排序的完美用例。在 O(nlogn) 中排序,在 O(1) 中提取 min
  • 是的@rayryeng,我可以使用 NumPy,实际上数组是使用 NumPy 存储的。
  • 我将如何使用堆排序 @rpg711 ?

标签: python arrays minimum


【解决方案1】:

我不知道你的实际数据的范围,所以我生成了一些随机数据。

from random import randrange

m, n = 100, 200

dist = [[i+j for j in range(n)] for i in range(n)]
part = [randrange(n) for k in range(m)]
inci = [randrange(9) for k in range(m)]

# keep only items in `part` where corresponding `inci` value < 2
part = [p for p,i in zip(part, inci) if i < 2]

# check dist for all couples in `part` and extract minimal value
d = min(dist[pi][pj] for pi in part for pj in part)

此代码仅给出最小距离。如果您还需要达到最小值的索引,最好切换到numpy 并使用它提供的argmin 函数。

【讨论】:

  • 对不起,我忘了补充一点,所有数组都是使用numpy 存储的。我在我的问题上添加了这一点。顺便说一句,实际数据是822个单元格的矩阵,m60左右。此搜索是循环的一部分,然后在其他一些功能发生后查找下一个分钟,依此类推。我确实需要达到最小值的索引,这就是我将它们存储在a 中的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2018-03-28
  • 2018-01-03
  • 2017-05-10
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多