2016-07-02 36 views
1

比方說,我有一個列表A拆分列表爲單獨但重疊的塊

A = [1,2,3,4,5,6,7,8,9,10] 

我想創建一個新的列表(比如說B)使用以下順序上面的列表中。

B = [[1,2,3], [3,4,5], [5,6,7], [7,8,9], [9,10,]] 

即前3個數字爲A[0,1,2]和第二3個數字爲A[2,3,4]等。

我相信在這樣一種操作中有一個功能numpy

+0

那麼按照什麼規則分割一個列表?進入與填充3組?請明確。 –

+0

另請參閱[你如何在Python中將列表分成均勻大小的塊?](http://stackoverflow.com/q/312443) –

+0

這裏我的窗口大小是3,即每個分割列表應該有3個元素第一次分割'[1,2,3]',步長爲2,所以第二個分割開始應該從第三個元素開始,第二個分割開始分別爲[3,4,5]。 – Rangooski

回答

4

只需使用Python的內置列表理解與列表切片做到這一點:

>>> A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> size = 3 
>>> step = 2 
>>> A = [A[i : i + size] for i in range(0, len(A), step)] 

這給了你,你找什麼:

>>> A 
[[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9], [9, 10]] 

但你」你必須寫幾行代碼,以確保你的代碼不會破壞前所未有的大小/步長值。

+2

另一個列表表達式是'list(zip(* [x [i :: 2] in range in(3)]))'。 – hpaulj

2

'重複'Paritition array into N chunks with Numpy建議np.split - 這對於非重疊分割很好。示例(在關閉後添加)重疊,每個子陣列上有一個元素。加上它與一個0.

How do you split a list into evenly sized chunks?有一些很好的列表答案,各種形式的生成器或列表的理解,但乍一看我沒有看到任何允許重疊 - 雖然巧妙地使用迭代器(如iterator.tee)應該是可能的。

我們可以將此歸咎於較差的問題措辭,但它不是重複的。

從示例和註釋工作:

這裏我的窗口大小爲3,即每個分裂名單應該有3個要素先被分割[1,2,3]和步長爲2,所以第二個分開始應從第3元素開始,第2次分割爲[3,4,5]。

下面是使用as_strided

In [64]: ast=np.lib.index_tricks.as_strided # shorthand 

In [65]: A=np.arange(1,12) 

In [66]: ast(A,shape=[5,3],strides=(8,4)) 
Out[66]: 
array([[ 1, 2, 3], 
     [ 3, 4, 5], 
     [ 5, 6, 7], 
     [ 7, 8, 9], 
     [ 9, 10, 11]]) 

我增加A的範圍,因爲我不想對付0墊的高級解決方案。

選擇目標shape很容易,5套3.選擇步幅需要更多關於跨步的知識。

In [69]: x.strides 
Out[69]: (4,) 

1d跨步或從一個元素步進到下一個元素是4個字節(長度爲一個元素)。從一行到下一行的步驟是原始的2個元素,或2 * 4個字節。

as_strided產生一個視圖。因此,改變其中的元素將影響原始值,並可能改變重疊值。添加.copy()進行復制;數組與數組將會產生一個副本。

更改步幅可以給出非重疊行 - 但要注意形狀 - 可以訪問原始數據緩衝區外的值。

In [82]: ast(A,shape=[4,3],strides=(12,4)) 
Out[82]: 
array([[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9], 
     [10, 11, 17]]) 

In [84]: ast(A,shape=[3,3],strides=(16,4)) 
Out[84]: 
array([[ 1, 2, 3], 
     [ 5, 6, 7], 
     [ 9, 10, 11]]) 
+0

如果您打算基於評論重新打開問題,那麼至少編輯**,然後編輯問題以包含額外的信息。我現在已經重新解決了這個問題,因爲它不清楚。 –

+0

@Martijn我得到了我的答案。請打開這個問題。這對其他人會有用。 – Rangooski

+0

@Rangooski在未來實際編輯你的問題。 –