计算 (Python) 中两个 .vtk 文件之间的距离

Calculate the distance between two .vtk files in (Python)

正在以下 .vtk 文件中应用转换:

im1.vtk:

# vtk DataFile Version 3.0
vtk output
ASCII
DATASET POLYDATA
POINTS 10 float
-61.2 40.8 0.0 
-55.3 39.3 0.0 
-49.2 39.3 0.0 
-43.2 40.4 0.0 
-37.3 42.1 0.0 
67.6 44.3 0.0 
63.4 49.8 0.0 
57.7 53.6 0.0 
51.0 55.3 0.0 
44.1 55.2 0.0

在另一个 .vtk 文件中的结果:

im2.vtk:

# vtk DataFile Version 4.0
vtk output
ASCII
DATASET POLYDATA
POINTS 10 float
-63.4695 36.4645 0
-57.3647 35.9114 0
-51.1496 36.6507 0
-45.102 38.259 0
-39.2082 40.2851 0
69.7562 40.4176 0
64.6497 45.5255 0
58.1449 49.2956 0
50.8203 51.2899 0
43.4762 51.6839 0

找到每个文件的每个点之间的距离(例如:欧几里德)并将其存储在列表 [d1,d2,...,d10] 或 numpy 数组中的最快方法是什么? (这只是一个示例,真正的 .vtk 文件包含 300 个点。所以列表应该是 [d1,d2,...,d300])。 VTK 中是否已经有一个方法可以做到这一点?

示例:

第一个点之间的距离 d1 应该是:

d1=sqrt((-61.2+63.4695)**2+(40.8-36.4645)**2+(0-0)**2)

编辑:

到目前为止我能想出的代码如下:

import numpy as np

with open('im1.vtk', 'rt') as vtk1:
   vtk_list1 = vtk1.readlines()
with open('im2.vtk', 'rt') as vtk2:
   vtk_list2 = vtk2.readlines()
dist_array = np.array([])
for i in range(5,14):
   landmark1 = np.asarray(vtk_list1[i].split(),dtype=np.float16)
   landmark2 = np.asarray(vtk_list2[i].split(),dtype=np.float16)
   dist = np.sqrt(np.sum((landmark1-landmark2)**2))
   dist_array = np.append(dist_array,dist)

是否有更快更清洁的最佳选择?

Is there an optimal one that is faster and cleaner?

当然 - 不用填充行,而是填充列并使用 numpy 的全部功能

沿线

import sys
import numpy as np

def read_vtk(fname):
    """
    """
    with open(fname, 'rt') as f:
        lines = f.readlines()

        l = lines[4]
        s = l.split()
        n = int(s[1])

        x = np.empty(n, dtype=float)
        y = np.empty(n, dtype=float)
        z = np.empty(n, dtype=float)

        for k in range(0, n):
            l = lines[5 + k]
            s = l.split()
            x[k] = float(s[0])
            y[k] = float(s[1])
            z[k] = float(s[2])

        return (x, y, z)

    return None

def main(fa, fb):
    """
    """
    nax, nay, naz = read_vtk(fa)
    nbx, nby, nbz = read_vtk(fb)

    d = np.power(nax-nbx, 2) + np.power(nay-nby, 2) + np.power(naz-nbz, 2)

    return np.sqrt(d)

if __name__ == "__main__":
    d = main("a.vtk", "b.vtk")

    print(d)

    sys.exit(0)