kamilsparrow
kamilsparrow

Reputation: 63

Distance between one point and rest of the points in an array

I am writing some code to calculate the real distance between one point and the rest of the points from the same array. The array holds positions of particles in 3D space. There is N-particles so the array's shape is (N,3). I choose one particle and calculate the distance between this particle and the rest of the particles, all within one array.

Would anyone here have any idea how to do this?

What I have so far:

xbox = 10
ybox = 10
zbox = 10
nparticles =15
positions = np.empty([nparticles, 3])
for i in range(nparticles):
     xrandomalocation = random.uniform(0, xbox)
     yrandomalocation = random.uniform(0, ybox)
     zrandomalocation = random.uniform(0, zbox)
     positions[i, 0] = xrandomalocation
     positions[i, 1] = yrandomalocation
     positions[i, 2] = zrandomalocation

And that's pretty much all I have right now. I was thinking of using np.linalg.norm however I am not sure at all how to implement it to my code (or maybe use it in a loop)?

Upvotes: 3

Views: 6641

Answers (2)

chacoff
chacoff

Reputation: 64

i am using this function:

from scipy.spatial import distance

def closest_node(node, nodes):
    closest = distance.cdist([node], nodes)
    index = closest.argmin()
    euclidean = closest[0]
    return nodes[index], euclidean[index]

where node is the single point in the space you want to compare with an array of points called nodes. it returns the point and the euclidean distance to your original node

Upvotes: 0

Matt Hall
Matt Hall

Reputation: 8152

It sounds like you could use scipy.distance.cdist or scipy.distance.pdist for this. For example, to get the distances from point X to the points in coords:

>>> from scipy.spatial import distance
>>> X = [(35.0456, -85.2672)]
>>> coords = [(35.1174, -89.9711),
...           (35.9728, -83.9422),
...           (36.1667, -86.7833)]
>>> distance.cdist(X, coords, 'euclidean')
array([[ 4.70444794,  1.6171966 ,  1.88558331]])

pdist is similar, but only takes one array, and you get the distances between all pairs.

Upvotes: 6

Related Questions