您可以使用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]])
謝謝!只是一個小問題,你爲什麼使用'arr.shape [-1]'而不是'arr.shape [1]'有一個特別的原因嗎? –
@ Jean-BaptisteMartin我猜想我有一個通用的ndarray,因此它可以用於選擇列的任何維度的數組,這將始終是最後一個維度。 – Divakar
也許值得注意的是,這和實現所需結果的幾乎所有其他方式一樣,都會創建一個新數組(複製數據),而不是原始數組的視圖。 – Dunes