這裏有一個量化的解決方案 -
m,n = a.shape
idx = np.mod((n-1)*np.arange(m)[:,None] + np.arange(n), n)
out = a[np.arange(m)[:,None], idx]
樣品輸入,輸出 -
In [256]: a
Out[256]:
array([[73, 55, 79, 52, 15],
[45, 11, 19, 93, 12],
[78, 50, 30, 88, 53],
[98, 13, 58, 34, 35]])
In [257]: out
Out[257]:
array([[73, 55, 79, 52, 15],
[12, 45, 11, 19, 93],
[88, 53, 78, 50, 30],
[58, 34, 35, 98, 13]])
因爲,你所提到的,你在呼喚這樣的壓延常規多次,創建索引陣列y idx
一次,稍後重新使用。
進一步改善
重複用法,你是最好創建完整的線性指標,然後使用np.take
提取捲起的元素,就像這樣 -
full_idx = idx + n*np.arange(m)[:,None]
out = np.take(a,full_idx)
讓我們來看看有什麼改進像 -
In [330]: a = np.random.randint(11,99,(600,600))
In [331]: m,n = a.shape
...: idx = np.mod((n-1)*np.arange(m)[:,None] + np.arange(n), n)
...:
In [332]: full_idx = idx + n*np.arange(m)[:,None]
In [333]: %timeit a[np.arange(m)[:,None], idx] # Approach #1
1000 loops, best of 3: 1.42 ms per loop
In [334]: %timeit np.take(a,full_idx) # Improvement
1000 loops, best of 3: 486 µs per loop
大約3x
有改進!
你能告訴你如何* *滾你行? –
這裏有一個可能的解決方案:http://stackoverflow.com/questions/20360675/roll-rows-of-a-matrix-independently –