DarthLazar DarthLazar - 4 months ago 8
Python Question

*Update* Creating an array for distance between two 2-D arrays

So I have two arrays that have x, y, z coordinates. I'm just trying to apply the 3D distance formula. Problem is, that I can't find a post that constitutes arrays with multiple values in each column and spits out an array.

print MW_FirstsubPos1

[[ 51618.7265625 106197.7578125 69647.6484375 ]
[ 33864.1953125 11757.29882812 11849.90332031]
[ 12750.09863281 58954.91015625 38067.0859375 ]
...,
[ 99002.6640625 96021.0546875 18798.44726562]
[ 27180.83984375 74350.421875 78075.78125 ]
[ 19297.88476562 82161.140625 1204.53503418]]

print MW_SecondsubPos1

[[ 51850.9140625 106004.0078125 69536.5234375 ]
[ 33989.9375 11847.11425781 12255.80859375]
[ 12526.203125 58372.3046875 37641.34765625]
...,
[ 98823.2734375 95837.1796875 18758.7734375 ]
[ 27047.19140625 74242.859375 78166.703125 ]
[ 19353.97851562 82375.8515625 1147.07556152]]


Yes, they are the same shape.

My attempt,

import numpy as np

xs1,ys1,zs1 = zip(*MW_FirstsubPos1)
xs11,ys11,zs11 = zip(*MW_SecondsubPos1)

squared_dist1 = (xs11 - xs1)**2 + (ys11 - ys1)**2 + (zs11 - zs1)**2
dist1 = np.sqrt(squared_dist1)

print dist1


This returns:

TypeError: unsupported operand type(s) for -: 'tuple' and 'tuple'


I'm just wanting to return a 1-D array of the same shape.

* --------------------- Update --------------------- *

Using what Sнаđошƒаӽ said,

Distance1 = []
for Fir1, Sec1 in zip(MW_FirstsubVel1, MW_SecondsubPos1):
dist1 = 0
for i in range(3):
dist1 += (Fir1[i]-Sec1[i])**2
Distance1.append(dist1**0.5)


But when comparing the distance formula for one element in my original post such as,

squared_dist1 = (xs11[0] - xs1[0])**2 + (ys11[0] - ys1[0])**2 + (zs11[0] - zs1[0])**2
dist1 = np.sqrt(squared_dist1)

print dist1


returns
322.178309762


while

result = []
for a, b in zip(MW_FirstsubVel1, MW_SecondsubPos1):
dist = 0
for i in range(3):
dist += (a[i]-b[i])**2
result.append(dist**0.5)

print result[0]


returns
137163.203004


What's wrong here?

Answer

Here's a vectorized approach using np.einsum -

diffs = MW_FirstsubPos1 - MW_SecondsubPos1
dists = np.sqrt(np.einsum('ij,ij->i',diffs,diffs))

Sample run -

In [233]: MW_FirstsubPos1
Out[233]: 
array([[2, 0, 0],
       [8, 6, 1],
       [0, 2, 8],
       [7, 6, 3],
       [3, 1, 7]])

In [234]: MW_SecondsubPos1
Out[234]: 
array([[3, 4, 7],
       [0, 8, 4],
       [4, 7, 4],
       [2, 5, 6],
       [5, 0, 6]])

In [235]: diffs = MW_FirstsubPos1 - MW_SecondsubPos1

In [236]: np.sqrt(np.einsum('ij,ij->i',diffs,diffs))
Out[236]: array([ 8.1240384 ,  8.77496439,  7.54983444,  5.91607978,  2.44948974])