3

2-dスライスを取得したい位置データの3D配列があります。ただし、スライスのz深さはx(そしてy最終的には)異なります。

例:配列100x100x100、そして最初のスライスをで始まる平行四辺形にしたい

x=0,y=0 => x=100,y=100zにある方向の点を含み、時間まで0-25x=0直線的に変化します。つまり、一種の斜めのスライスです。z=25-50x=100

numpyでこれを行う効率的な方法はありますか?理想的には

    newarray = oldarray[z> x/100*25.0 && z < 25+x/100*25.0]
4

2 に答える 2

1

これは、を使用して行うことができますmap_coordinates。3x3x3ボリュームの小さな例を次に示します。

a = np.arange(27).reshape(3,3,3)
xi,yi = np.meshgrid(range(3),range(3))
zi = xi*.25+yi*.25
inds = np.array([xi.reshape(1,9),yi.reshape(1,9),zi.reshape(1,9)])
ndimage.map_coordinates(a,inds).reshape(3,3)
>> array([[ 0,  9, 18],
       [ 3, 12, 22],
       [ 6, 16, 25]])

すべての形状を変更せずにこれを行うためのより良い方法があるかもしれないことに注意してください。

于 2012-10-02T16:36:46.183 に答える
1

目的のデータはおそらく元のデータのストライドビューとして表現できないため、高度なインデックスを使用して目的の座標を引き出す必要があります。

c = np.r_[:100]
xi = c.reshape((100, 1, 1))
yi = c.reshape((1, 100, 1))
zi = np.empty((100, 100, 25), dtype=int)
for x in xrange(100):
    for y in xrange(100):
        zi[x,y] = np.arange(x*25/100, x*25/100+25) # or whatever other function

newarray = oldarray[xi, yi, zi]

oldarraynumpy配列を使用してxiスライスするとyizi高度なインデックス作成がトリガーされます。Numpyは、ブロードキャストxiによって形成されたものと同じ形状の新しい配列を作成します(したがって、この場合、は(100、1、1)、は(1、100、1 )、は( 100、100、25 )です。 )、出力は(100、100、25))になります。yizixiyizi

次に、Numpyはxiyiおよびzi(ブロードキャストを使用)の対応する要素を使用してその配列を埋めます。newarray[i, j, k] = oldarray[xi[i, 0, 0], yi[0, j, 0], zi[i, j, k]]

于 2012-10-02T17:02:16.830 に答える