比较数组中的对象属性:Python

时间:2012-07-13 22:43:47

标签: python

我有一个课程,定义水滴如何在三维空间中移动。

我需要比较每个液滴的位置,以确定它们是否在一段时间后相互碰撞。我定义其位置的方式有三个值,xyz。每个值都是水滴的属性。

我将大量的水滴放入阵列中。我的代码如何在不进行重复比较的情况下比较所有代码,因为如果碰撞会形成更大的液滴?

2 个答案:

答案 0 :(得分:3)

您可能希望调查octrees的使用情况。通过将您的积分保持在八叉树中,您可以大大减少您必须进行的比较次数(因为您已经知道某些点肯定不会与其他点发生碰撞)。

答案 1 :(得分:1)

你能根据位置排序吗?然后你只需要比较相邻的元素...如果你采取的步长很小,你只能每隔几步进行一次排序并比较相邻的几个水滴,并根据需要合并。

import numpy as np

def merge(p1,p2):    
    #somehow merge particles.  With real particles, mass might matter too,
    #but my particles only have position :-)
    return (p1+p2)/2 #average location of particles.

def merge_particles(particles,merge_dist_squared):
    #Merge particles in 1 pass through the list
    #This will always work if the particles are sorted in order
    #It will fail if the particles aren't sorted well enough.
    i=1
    output=[]
    prev=particles[0] #location of previous (first) particle
    while i<(len(particles)):
        dist_vec=(particles[i]-prev)
        dist_squared=np.dot(dist_vec,dist_vec)
        if dist_squared > merge_dist_squared: #particle isn't close enough to merge
            output.append(prev)
            prev=particles[i]
        else:                       #particle is close enough to merge
            prev=merge(prev,particles[i])
        i+=1

    output.append(prev) #Have to make sure we add the last particle.

    return output

#create N particles:
N=1000
particles=[np.random.random(3) for x in xrange(N)]
particles.sort(key=tuple) #sort particles based on position.
particles=merge_particles(particles,0.1**2)
print len(particles)