这个问题的目的是用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)。有什么想法吗?
谢谢!
答案 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)是否对两个数组后缀都有效,因为您可能无法同时执行这两个数组。