2

numpyで、m次元プローブ(m<n)でn次元データボリュームをサンプリングする最良の方法は何ですか? たとえば、傾斜した 2D 平面を持つ 3D アレイですか? これは、2 つのベクトル v1、v2 がまたがる平面上にサンプリング ポイントを作成するサンプル コードです。これを ndimage.map_coordinates に入力できますが、もっと良い方法があると確信しています。

o = [0, 0, 0] # origin
v1 = [1, 0, 0]; l1=1 # First vector and length
v2 = [0, 1, 0]; l2=1 # Second vector and length

ds1,ds2 = 10,10 # samples per direction

l1x,l1y,l1z = np.linspace(o[0],v1[0]*l1,ds1),np.linspace(o[1],v1[1]*l1,ds1),np.linspace(o[2],v1[2]*l1,ds1)
l2x,l2y,l2z = np.linspace(o[0],v2[0]*l2,ds2),np.linspace(o[1],v2[1]*l2,ds2),np.linspace(o[2],v1[2]*l2,ds2)
llx, lly, llz = l1x, l1y, l1z

# shift points in direction of 2nd vector and append 
for i in range(1,ds2):
  llx = np.hstack((llx,l1x+l2x[i]))
  lly = np.hstack((lly,l1y+l2y[i]))
  llz = np.hstack((llz,l1z+l2z[i]))

ptcoords = np.vstack((llx,lly,llz)).T 

編集:これを定式化するためのより適切な方法を見つけました: lm がリスト全体で固定されているが、n要素によって異なるため、このコードはプローブ配列全体を構築します。

base = l[0] # if l[0] is the only one
for ll in l[1:]:
  n = ll.shape[0]
  nb = base.shape[0]
  base = np.repeat(ll,nb,0) + np.vstack(np.hsplit(np.tile(base,n),n))

それでも、ループは回避可能であり、多くの配列操作が必要になると思います! いくつかの 3D 構成でテストしました。これがスクリーンショットです。洗練したり、バグを見つけたりできるかどうか教えてください。いくつかの 3D プローブ アレイのスクリーンショット

4

1 に答える 1

1

3Dデータと2DカットはMayaviを使っています。非常に大まかに言うと、次の手順を実行する必要があります: データをロードし、ドロネー三角形分割フィルターを追加し、ボリュームを視覚化し、スカラー切断面を追加し、配置してデータを読み取ります。

于 2013-09-11T17:41:00.670 に答える