a
これは、インデックスのみのコピーにロールを適用し、ロールされた値でw
元のインデックスを設定することで機能します。a
a[w] = np.roll(a[w], 1, axis=1)
誰かが答えを持っていました(@sebergだと思いますが、現在は削除されています)、2つの列のローリングは反転と同等であり、実際にはする必要はなくroll
、インデックストリックによる反転を使用できることを示しました:
a[w] = a[w, ::-1]
大規模な配列の場合、タイミングは同様です。短い配列の場合、roll
ソリューションは遅くなります。これがタイミングです。
N = 10
a = np.arange(N*2).reshape(-1,2)
w = np.random.choice(np.arange(N), size=N/2, replace=False)
timeit a[w] = np.roll(a[w],1,1)
10000 loops, best of 3: 23.2 µs per loop
timeit a[w] = a[w, ::-1]
100000 loops, best of 3: 8.07 µs per loop
N = 1000
a = np.arange(N*2).reshape(-1,2)
w = np.random.choice(np.arange(N), size=N/2, replace=False)
timeit a[w] = np.roll(a[w],1,1)
10000 loops, best of 3: 113 µs per loop
timeit a[w] = a[w, ::-1]
10000 loops, best of 3: 93.6 µs per loop
N = 100000
a = np.arange(N*2).reshape(-1,2)
w = np.random.choice(np.arange(N), size=N/2, replace=False)
timeit a[w] = np.roll(a[w],1,1)
100 loops, best of 3: 10.8 ms per loop
timeit a[w] = a[w, ::-1]
100 loops, best of 3: 9.63 ms per loop