2016-07-13 32 views
2

我想選擇一個numpy數組中的第n組第n列。這意味着,我想在第一n列,而不是第n列的下一個,該n下一列,而不是第n列的下一個等選擇n列的每個交替組 - NumPy

例如,用下面的陣列和n=2

import numpy as np 
arr = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
       [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]) 

我想獲得:

[[1, 2, 5, 6, 9, 10], 
[11, 12, 15, 16, 19, 20]] 

而且隨着n=3

[[1, 2, 3, 7, 8, 9], 
[11, 12, 13, 17, 18, 19]] 

n=1我們可以簡單地使用語法arr[:,::2],但有沒有類似的n>1

回答

3

您可以使用modulus創建從0開始的坡道,直到2n,然後從每個這樣的坡道中選擇第一個n。因此,對於每個斜坡,我們將首先將n設置爲True並將其餘設置爲False,以便爲我們提供覆蓋陣列整個長度的布爾陣列。然後,我們沿着列簡單地使用boolean indexing來選擇最終輸出的有效列。因此,實施將是這個樣子 -

arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n] 

一步一步的代碼運行給一個更好的主意 - 在各種n

In [43]: arr 
Out[43]: 
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
     [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]) 

In [44]: n = 3 

In [45]: np.mod(np.arange(arr.shape[-1]),2*n) 
Out[45]: array([0, 1, 2, 3, 4, 5, 0, 1, 2, 3]) 

In [46]: np.mod(np.arange(arr.shape[-1]),2*n)<n 
Out[46]: array([ True,True,True,False,False,False,True,True,True,False]) 

In [47]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n] 
Out[47]: 
array([[ 1, 2, 3, 7, 8, 9], 
     [11, 12, 13, 17, 18, 19]]) 

樣品試驗 -

In [29]: arr 
Out[29]: 
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
     [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]) 

In [30]: n = 1 

In [31]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n] 
Out[31]: 
array([[ 1, 3, 5, 7, 9], 
     [11, 13, 15, 17, 19]]) 

In [32]: n = 2 

In [33]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n] 
Out[33]: 
array([[ 1, 2, 5, 6, 9, 10], 
     [11, 12, 15, 16, 19, 20]]) 

In [34]: n = 3 

In [35]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n] 
Out[35]: 
array([[ 1, 2, 3, 7, 8, 9], 
     [11, 12, 13, 17, 18, 19]]) 
+0

謝謝!只是一個小問題,你爲什麼使用'arr.shape [-1]'而不是'arr.shape [1]'有一個特別的原因嗎? –

+0

@ Jean-BaptisteMartin我猜想我有一個通用的ndarray,因此它可以用於選擇列的任何維度的數組,這將始終是最後一個維度。 – Divakar

+1

也許值得注意的是,這和實現所需結果的幾乎所有其他方式一樣,都會創建一個新數組(複製數據),而不是原始數組的視圖。 – Dunes