2016-07-13 5 views
2

Ich möchte jede n-te Gruppe von n Spalten in einem numply-Array auswählen. Es bedeutet, dass ich die ersten n Spalten wollen, nicht die n nächsten Spalten, die n nächsten Spalten, nicht die n nächsten Spalten usw.Auswählen jeder alternativen Gruppe von n Spalten - NumPy

Zum Beispiel mit dem folgenden Array und 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]]) 

I möchte bekommen:

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

Und mit n=3:

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

Mit n=1 können wir einfach die Syntax arr[:,::2] verwenden, aber gibt es etwas ähnliches für n>1?

Antwort

3

können Sie modulus verwenden Rampen von 0 bis 2n beginnen zu erstellen und dann die ersten n von jedem dieser Rampe aus. Somit hätten wir für jede Rampe zuerst n als True und als False einen booleschen Array, der die gesamte Länge des Arrays abdeckt. Dann verwenden wir einfach boolean indexing entlang der Spalten, um die gültigen Spalten für die endgültige Ausgabe auszuwählen. Somit würde die Umsetzung in etwa so aussehen -

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

Schritt für Schritt Code ausgeführt wird eine bessere Vorstellung zu geben -

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

Probe läuft über verschiedene n -

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

Thank you! Nur eine kleine Frage, gibt es einen bestimmten Grund, warum Sie 'arr.shape [-1]' und nicht 'arr.shape [1]' verwenden? –

+0

@ Jean-BaptisteMartin Ich denke, ich hatte ein generisches NDarray im Kopf, so dass es für Arrays mit beliebigen Dimensionen für die Auswahl von Spalten funktionieren würde, was immer die letzte Dimension wäre. – Divakar

+1

Vielleicht ist es bemerkenswert, dass dies und so ziemlich jede andere Art, das gewünschte Ergebnis zu erzielen, ein neues Array (kopiert die Daten) statt einer Ansicht des ursprünglichen Arrays erzeugt. – Dunes

Verwandte Themen