7

NumPy で作業しているため、この記事を使用して 3D 配列から 2D 配列をスライスする方法を理解しています。

スライスしたい軸に応じて:

array = [[[0  1  2]
          [3  4  5]
          [6  7  8]]

         [[9  10 11]
          [12 13 14]
          [15 16 17]]

         [[18 19 20]
          [21 22 23]
          [24 25 26]]]

スライスすると、次のようになります。

i_slice = array[0]

    [[0  1  2]
     [3  4  5]
     [6  7  8]]

j_slice = array[:, 0]

    [[0  1  2]
     [9  10 11]
     [18 19 20]]

k_slice = array[:, :, 0]

    [[0  3  6]
     [9  12 15]
     [18 21 24]]

しかし、45度の角度でスライスすることは可能ですか? そのような:

j_slice_down = array[slice going down starting from index 0]

    [[0  1  2]
     [12 13 14]
     [24 25 26]]

3つの軸すべてが上下に移動し、さらには全体をラップすることでこれを達成することができました...多くのforループがあるダークリストの日に...しかし、NumPyにはもっと良い方法があるに違いないと確信しています.

更新、選択した回答:

で2つの座標配列を作成するhpauljの回答を選択しましたnp.arrange。ちょっとした作業で、任意の角度、任意の軸、3D 配列の非対称次元、任意の位置でスライスを返すという私のニーズに合うようにすることができました。軸として。

np.arrange を使用した私の方法

と に対して2 つのnp.arrange配列が作成されましxy

np.roll、インクリメント、np.hstackおよびなどのさまざまな方法が、配列 x 軸配列np.concatenateで実行されました。別の角度の場合。np.arrangey = y[::-1]

if axis is 'z': #i
    slice_notation = np.index_exp[x, y, :] 

elif axis is 'y': #k
    slice_notation = np.index_exp[x, :, y]

else: #j 
    slice_notation = np.index_exp[:, x, y]

スライス式を作成し、 を使用しslice_notationて必要な操作をその場で実行します。

他の提案された方法:np.diagonalおよび他のnp.eye人には、私とは異なる要件がある可能性があるため、より適している可能性があります。

4

2 に答える 2