3

定期的な条件で 3x3 形状の numpy 配列をスライスするにはどうすればよいですか。

たとえば、簡単にするために、1 次元で次のようにします。

import numpy as np
a = np.array(range(10))

スライスが配列の長さの範囲内にある場合、それは簡単です

sub = a[2:8]

結果はarray([2, 3, 4, 5, 6, 7])です。ここで、7 から 5 にスライスする必要がある場合は ...

sub = a[7:5]

結果は明らかにarray([], dtype=int32)です。しかし、私が必要なのはarray([7,8,9,0,1,2,3,4])

そうする効率的な方法はありますか?

4

2 に答える 2

2

同様に、定期的な条件でロールまたはスライスまたはスライスを行うための適切で簡単な方法は、modulo と numpy.reshape を使用することです。例えば

import numpy as np
a = np.random.random((3,3,3))
array([[[ 0.98869832,  0.56508155,  0.05431135],
        [ 0.59721238,  0.62269635,  0.78196073],
        [ 0.03046364,  0.25689747,  0.85072087]],

       [[ 0.63096169,  0.66061845,  0.88362948],
        [ 0.66854665,  0.02621923,  0.41399149],
        [ 0.72104873,  0.45633403,  0.81190428]],

       [[ 0.42368236,  0.11258298,  0.27987449],
        [ 0.65115635,  0.42433058,  0.051015  ],
        [ 0.60465148,  0.12601221,  0.46014229]]])

[0:3, -1:1, 0:3] をスライスする必要があるとしましょう。ここで、3:1 は丸められたスライスです。

a[0:3, -1:1, 0:3]
array([], shape=(3, 0, 3), dtype=float64)

これはごく普通のことです。解決策は次のとおりです。

sl0 = np.array(range(0,3)).reshape(-1,1, 1)%a.shape[0]
sl1 = np.array(range(-1,1)).reshape(1,-1, 1)%a.shape[1]
sl2 = np.array(range(0,3)).reshape(1,1,-1)%a.shape[2]

a[sl0,sl1,sl2]
array([[[ 0.03046364,  0.25689747,  0.85072087],
        [ 0.98869832,  0.56508155,  0.05431135]],

       [[ 0.72104873,  0.45633403,  0.81190428],
        [ 0.63096169,  0.66061845,  0.88362948]],

       [[ 0.60465148,  0.12601221,  0.46014229],
        [ 0.42368236,  0.11258298,  0.27987449]]])
于 2013-02-27T15:48:37.100 に答える
2

あなたが探しているのはnumpy.rollだと思います。例から:

x = np.arange(10)

np.roll(x, 2)
array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])

np.roll(x, -2)
array([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])
于 2013-02-27T13:38:34.937 に答える