我正在尝试计算点之间的初始距离和后续距离。 我得到的数据是一个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)
我想要一个数组,其中每一列都是相邻标记之间的欧几里得距离,而行对应于每次的距离。
答案 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)
这应该是您需要的数据。