2017-01-25 7 views
3

私は、各セルが非3次元ボクセル(3次元すべてで任意にスケーリングされています)を表す空間ボリューム上に3dグリッドを表すnumpy配列を持っています。配列は次元ごとにO(500)ボクセルです。ポイントからの距離でnumpy配列を塗りつぶす最速の方法

私は与えられたXYZ点から各ボクセルの中心までの距離でその配列を塗りたいと思います。

python for -loopsを使って配列を塗りつぶすことができますが、それは私が望むよりも遅いです。 numpy/scipyを使って素早く行う方法はありますか?

XYZ座標への変換は、0,0,0ボクセルの中心のXYZ座標を与えるものとXYZ単位のボクセルのサイズを与えるものとの2つのタプルで行われます。

答えて

2

(ogrid結果が正しく放送することを使用して)各次元での距離とogridを作成し、距離を計算します。

import numpy as np 

x0, y0, z0 = 10, 10, 10 

# assuming each dimension includes 500 points, from 0 to 500, step 1 
x, y, z = np.ogrid[0:500, 0:500, 0:500] 
distances = np.sqrt((x-x0)**2+(y-y0)**2+(z-z0)**2) 

あなたには、いくつかのスケーリングを含めると、グリッドのオフセットする必要がある場合:

x, y, z = np.ogrid[0:500, 0:500, 0:500] 
x, y, z = (x * scale_x + offset_x, 
      y * scale_y + offset_y, 
      z * scale_z + offset_z) 
distances = np.sqrt((x-x0)**2+(y-y0)**2+(z-z0)**2) 
1

3D配列の平らなX、Y、Z座標を表す3つの1次元配列を作成できます。

は次に、numpyの方法を用いて、全アレイのhypothenuse計算を実行し

D = numpy.sqrt(numpy.power(X - x_center, 2) + 
       numpy.power(Y - y_center, 2) + 
       numpy.power(Z - z_center, 2)) 

終わりに、あなたは元の形状に配列を再構築します。

+1

なぜ、 'np.power(x、2)'の代わりに 'np.square(x)'を使うのですか? – MSeifert

関連する問題