2

这个问题的目的是提高我使用 python 和/或算法的技能。

我有两个数组(modes[:,2],modes[:,3])并试图找出所有可能的独特组合,其中

modes[i,2]+modes[j,2] = modes[k,2] (within a numerical bound)
AND
modes[i,3]+modes[j,3] = modes[k,3] (within a numerical bound)

现在我只是使用一个简单的三重嵌套循环来做到这一点:

import numpy as np
# Load the array from file
modes=np.loadtxt('nonzeros.txt')
ebk=modes[:,4].max()
ofile=open('parametric_modes.txt','w')


for k in range(len(modes[:,0])):
   for i in range(len(modes[:,0])):
      for j in range(i+1,len(modes[:,0])):

         # Check for the resonance condition.
         if modes[k,2]-0.01 <= modes[i,2]+modes[j,2]\
             <=modes[k,2]+0.01 and modes[k,3]-0.01 <=\
          modes[i,3]+modes[j,3] <= modes[k,3]+0.01:

            # Check the amplitude.
            if modes[k,4] >= ebk*2e-3:

               print >> ofile,modes[i,4],modes[j,4],modes[k,4],\
                              modes[i,2],modes[j,2],modes[k,2],\
                              modes[i,3],modes[j,3],modes[k,3]

ofile.close()

但由于显而易见的原因,我得到了重复的组合。应该有一种更优雅的方式(算法或pythonic)。有任何想法吗?

谢谢!

4

3 回答 3

1
l = len(modes[:,0])

[(i, j, k) for i in range(0, l) for i in range(0, l ) for j in range(i, l ) if (abs(modes[i,2]+modes[j,2] - modes[k,2]) + abs(modes[i,3]+modes[j,3] - modes[k,3])) < .01 ]
于 2013-04-26T17:17:46.360 回答
1

你可以做 O(n^2logn)。

对数组进行排序。对于 i&j 的每个组合,进行二分搜索以获得最接近的 k 以匹配您的条件。

于 2013-04-26T17:22:17.323 回答
0

您正在尝试解决两个相当于3SUM 问题的实例,维基百科对此有一个简单的 O(N^2) 算法。为您的目的调整它应该很简单。您只需要调整它以使用 A+B=C 并允许限制 C,这可能需要使用两个点而不是 1 来表示 C、下限索引和上限索引。

您可能必须对两个数组都执行此操作,然后检查三元组 (i,j,k) 是否对两个数组后缀都有效,因为您可能无法同时执行两个数组。

于 2013-04-27T11:11:07.620 回答