如何计算数组中3D坐标中的距离

时间:2019-06-20 00:18:30

标签: python numpy

我正在尝试计算点之间的初始距离和后续距离。 我得到的数据是一个csv,其中每三列对应一个LED标记。即第1列是标记1的x坐标,第2列是标记1的y坐标,第3列是标记1的z坐标。每行对应于记录位置的时间。 我很难确定组织数据的最佳方法,以便可以使用它。 我需要a)查找时间0时标记之间的初始位置和初始距离 和b)查找标记在不同时间之间的距离是否有变化。

我最初将所有x坐标放置在数组中,将所有y坐标放置在数组中,并且将所有z坐标放置在数组中,但是意识到我无法(不知道如何?)遍历数组,因此我可以找到相邻点之间的差异。即。标记1和标记2之间的距离为sqrt((x2-x1)** 2+(y2-y1)** 2+(z2-z1)** 2),但由于x2和x1位于同一数组中,因此无法t(不知道如何?)迭代所有xs(分别是ys和zs)之间的差。 在下面的代码中,我转置了数组,以便可以遍历行(而不是列)

for i in range(m): #where m is the number of markers
    x_diff= x_array[i+1]-x_array[i]
    y_diff=y_array[i+1]-y_array[i]
    z_diff=z_array[i+1]-z_array[i]
    dist=np.sqrt(x_diff**2+y_diff**2+z_diff**2)

我想要一个数组,其中每一列都是相邻标记之间的欧几里得距离,而行对应于每次的距离。

3 个答案:

答案 0 :(得分:1)

您可以将SciPy的pdist函数用于成对距离。例如,

>>> X
array([[1, 2, 3],
       [1, 2, 3],
       [4, 0, 0]])
>>> from scipy.spatial.distance import pdist
>>> pdist(X)
array([0.        , 4.69041576, 4.69041576])

距离以(0,1),(0,2),(1,2)成对输出。

答案 1 :(得分:0)

这是从数组开始的分步操作,该数组的布局与原始csv一样:

# 2 time points, 4 markers, values between 0 and 8
csv = np.random.randint(0,9,(2,12))
csv
# array([[8, 5, 3, 2, 3, 2, 2, 5, 6, 8, 2, 4],
#        [8, 2, 7, 4, 7, 7, 8, 0, 3, 0, 2, 4]])

# reshape to get x,y,z aligned
m,n = csv.shape
xyz = csv.reshape(m,-1,3)
xyz
# array([[[8, 5, 3],
#         [2, 3, 2],
#         [2, 5, 6],
#         [8, 2, 4]],
#
#        [[8, 2, 7],
#         [4, 7, 7],
#         [8, 0, 3],
#         [0, 2, 4]]])

# get coordinate-wise differences between adjacent markers
dist_1d = np.diff(xyz,axis=1)
dist_1d
# array([[[-6, -2, -1],
#         [ 0,  2,  4],
#         [ 6, -3, -2]],
#
#        [[-4,  5,  0],
#         [ 4, -7, -4],
#         [-8,  2,  1]]])

# compute squared Euclidean distance
# (you could take the square root of that but if you are
# only interested in changes it doesn't seem necessary)
eucl2 = (dist_1d*dist_1d).sum(axis=2)
eucl2
# array([[41, 20, 49],
#        [41, 81, 69]])

答案 2 :(得分:0)

您需要将2d数组转换为3d数组。

public ItemRepository getItemRepository(){
return reporitoryProvider.getRepositoryWithRegisteredGsonAdapter(new GsonAdaptersItem());
}

然后沿第二个轴(在点之间) //Simple ItemRepository creation ItemRepository items = new ItemRepository( RepositorySetup.forUri("mongodb://localhost/test") );

 for (y in 2012:2017){
     save("Year" ,y)<- for (i in 3:8)

{
   read_xlsx("/Users/.../Desktop/Kriminalität.xlsx", sheet = i , skip = 4)
}

然后沿最后一个轴进行规范

rows, cols = csv.shape
csv_3d = csv.reshape(rows, -1, 3)

这应该是您需要的数据。