比方說,我有一個列表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
。
比方說,我有一個列表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
。
只需使用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]]
但你」你必須寫幾行代碼,以確保你的代碼不會破壞前所未有的大小/步長值。
另一個列表表達式是'list(zip(* [x [i :: 2] in range in(3)]))'。 – hpaulj
'重複'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]])
如果您打算基於評論重新打開問題,那麼至少編輯**,然後編輯問題以包含額外的信息。我現在已經重新解決了這個問題,因爲它不清楚。 –
@Martijn我得到了我的答案。請打開這個問題。這對其他人會有用。 – Rangooski
@Rangooski在未來實際編輯你的問題。 –
那麼按照什麼規則分割一個列表?進入與填充3組?請明確。 –
另請參閱[你如何在Python中將列表分成均勻大小的塊?](http://stackoverflow.com/q/312443) –
這裏我的窗口大小是3,即每個分割列表應該有3個元素第一次分割'[1,2,3]',步長爲2,所以第二個分割開始應該從第三個元素開始,第二個分割開始分別爲[3,4,5]。 – Rangooski