2013-02-27 60 views
2

如何在週期性條件下切片3x3形狀numpy陣列。在週期性條件下切片numpy陣列

例如,爲了簡單起見其在一個維度:

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])

有沒有任何有效的方法來做到這一點?

回答

1

做着同樣一個良好的和簡單的方式捲起或切片或切片週期性條件是使用模和numpy的。重塑。 例如

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]]]) 
+0

不要看到優勢超過滾動(這基本上是它所做的)。目前,你可能可能輕微擊敗速度明智的連接電話。編輯:對不起,你不一定需要整個座標軸,所以當然是有區別的,只是沒有在這個例子中。 – seberg 2013-02-27 15:58:24

1

我想你要找的是什麼:numpy.roll(http://docs.scipy.org/doc/numpy/reference/generated/numpy.roll.html

+0

numpy.roll是一種解決方案,但對於for循環中的大數組,它變得沉重我正在尋找直截了當的切片。 – Cobry 2013-02-27 13:45:21

+0

爲什麼你認爲切片會更快(即使有可能)? – 2013-02-27 14:07:41

+0

,因爲在最壞的情況下切片會複製切片部分或數組,而numpy.roll將始終複製整個數組。這在我的情況下並不理想 – Cobry 2013-02-27 14:15:02