检查共振条件 - Pythonic /算法的改进?

时间:2013-04-26 17:06:54

标签: python algorithm

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

我有两个阵列(模式[:,2],模式[:,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)。有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分: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 ]

答案 1 :(得分:1)

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

对数组进行排序。对于i&amp; j的每个组合,进行二分搜索以获得最接近的k以符合您的标准。

答案 2 :(得分:0)

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

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