【问题标题】:Check for resonance conditions - Pythonic/Algorithmic improvements?检查共振条件 - Pythonic/算法改进?
【发布时间】:2013-04-20 22:33:41
【问题描述】:

这个问题的目的是提高我在 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)。有什么想法吗?

谢谢!

【问题讨论】:

    标签: python algorithm


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      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 ]
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-23
          相关资源
          最近更新 更多