2015-02-09 5 views
7

Angenommen, Sie die folgende numpy Array haben,Pythonic Art und Weise Teil eines numpy Anordnung von Schneiden aus

>>> x = numpy.array([0,1,2,3,4,5,6,7,8,9,10]) 

und Sie wollen ein neues numpy Array extrahieren, die aus nur die ersten drei (3) und die letzten vier (4) Elemente, dh

>>> y = x[something] 
>>> print y 
[0 1 2 7 8 9 10] 

Ist das möglich? Ich weiß, dass, um die ersten drei Zahlen zu extrahieren, Sie einfach tun x[:3] und die letzten vier extrahieren Sie tun x[-4:], aber gibt es eine einfache Möglichkeit, all das in einem einfachen Stück zu extrahieren? Ich weiß, das durch getan werden kann, beispielsweise beiden Anrufe anhängen,

>>> y = numpy.append(x[:3],x[-4:]) 

aber ich frage mich, ob es ein einfacher kleiner Trick ist es in einer direkteren, pythonic Art und Weise zu tun, ohne x wieder zu verweisen, die (dh ich dachte zuerst, dass vielleicht x[-4:3] funktionieren könnte, aber ich erkannte sofort, dass es keinen Sinn ergab).

+0

Die Frage ist ähnlich zu dieser, aber die vorgeschlagenen Lösungen dort wird nicht für neuere numpy Versionen funktionieren, so dass es wahrscheinlich nicht mehr relevant ist. Noch könnte interessant sein: http://stackoverflow.com/questions/13525266/multiple-slice-in-listing-for-numpy-array – Wolph

Antwort

2

Ich denke, Sie sollten index arrays verwenden.

indices = list(range(3))+list(range(-4,0)) 
y = x[indices] 

können Sie wahrscheinlich list Abgüsse (nicht sicher, weil Python 3 wird das Verhalten ein wenig verändert) fallen. Oder Sie könnten numpy Bereich Genreatoren verwenden.

Edit: nicht sicher, warum die downvote, Ursache it works:

import numpy 
x = numpy.array([0,1,2,3,4,5,6,7,8,9,10]) 
indices = list(range(3))+list(range(-4,0)) 
y = x[indices] 
print(y) 
+0

Ja, eigentlich ist das gleiche, was mir eingefallen ist, nachdem ich @mgilson antwort (siehe die Kommentare). Vielleicht, wenn Sie hinzufügen, was wir in diesem Beitrag in Bezug auf die Verwendung von "Liste" um die "Reichweite" kommentiert habe, könnte ich dies als die beste Antwort akzeptieren :). –

+0

Ich tippte meine Antwort ein, bevor ich Kommentare sah, ich wollte es mit "dynamischen" Bereichen machen und mit den Dokumenten verlinken. – luk32

4

Eine einfache Scheibe wird wahrscheinlich nicht funktionieren. Sie können numpy des erweiterten Slicing verwenden:

>>> import numpy as np 
>>> a = np.arange(10) 
>>> something = [0, 1, 2, -4, -3, -2, -1] 
>>> a[something] 
array([0, 1, 2, 6, 7, 8, 9]) 

Hinweis Ich ging in einer Liste von Indizes, die ich aus dem ursprünglichen Array nehmen wollte ...

Ehrlich gesagt aber Ihre Lösung mit np.append wahrscheinlich genauso gut ...

+0

Es könnte wie das gleiche scheinen, aber jetzt, dass ich dein Beispiel sehe, denke ich dass ein eleganter Weg dasselbe zu machen wäre: 'etwas = Bereich (0,3) + Bereich (-4,0,1)'. Eine allgemeine Art, die ersten 'n' Elemente und die letzten' m' Elemente zu schneiden, wäre also: 'something = Bereich (0, n) + Bereich (-m, 0,1)'! –

+2

Sei vorsichtig, wenn du 'range' zusammen fügst, in Python3 sind es' range' Objekte, keine Listen und du bekommst einen TypeError. – Ffisegydd

+1

Hallo @Ffisegydd; Danke für die Eingabe. Dies bedeutet, dass eine mehr versionsunabhängige Art und Weise dies zu tun wäre "etwas = Liste (Bereich (0, n)) + Liste (Bereich (-m, 0,1))"? –

1
np.arange(11)[np.r_[0:3,7:11]] 
# array([ 0, 1, 2, 7, 8, 9, 10]) 

np.r_ eine Funktion ist, tatsächlich ein Wende Objekt, in numpy/lib/index_tricks. Es benötigt mehrere Schichten oder Indizes und verknüpft sie zu einem Indexierungsfeld.

np.r_[0:3,7:11] 
# array([ 0, 1, 2, 7, 8, 9, 10]) 

Oder aufgenommene Kredite von luk32 s Antwort, eine negative Scheibe funktioniert:

a[np.r_[:3,-4:0]] 

Eine Alternative, die 2 Teile zum Spleißen ist die Mitte zu löschen. s_ können Sie die Slice-Notation innerhalb der Funktion verwenden.

np.delete(np.arange(11),np.s_[3:7]) 
# array([ 0, 1, 2, 7, 8, 9, 10]) 

Blick auf den Code für die .lib.index_tricks, delete und insert Funktionen für mehr Ideen, wie Index-Arrays aus mehreren Stücken zu konstruieren.

Manchmal ist ein boolescher Index praktisch. Setzen Sie alles auf Wahr oder Falsch und drehen Sie ausgewählte Elemente um.

i = np.ones(a.shape,dtype='bool') 
i[3:7] = False 
a[i] 
Verwandte Themen