2017-08-10 7 views
1

(パイソン)で2つの.vtkのファイルの間の距離を計算し、次の.vtkファイルに変換を適用

im1.vtk:別の.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 

結果:

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) 

EDIT次のよう

私はこれまで思い付く可能性コードである:

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) 

高速でクリーナーに最適なものはありますか?

答えて

1

高速でクリーナーに最適なものはありますか?

確か - 代わりの行を充填する、カラムを充填し、線に沿って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) 
関連する問題