这通过将滚动应用于a
仅 at 索引的副本,w
然后a
使用滚动值设置原始值:
a[w] = np.roll(a[w], 1, axis=1)
有人有一个答案(我认为@seberg,但它现在已被删除)表明对于两列滚动相当于反转,您实际上不需要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