DarthLazar - 3 months ago 7
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?

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])
``````