Ich verwende numpy und möchte eine Zeile indizieren, ohne die Dimensionsinformationen zu verlieren.
import numpy as np
X = np.zeros((100,10))
X.shape # >> (100, 10)
xslice = X[10,:]
xslice.shape # >> (10,)
In diesem Beispiel ist xslice jetzt 1 Dimension, aber ich möchte, dass es (1,10) ist. In R würde ich X [10,:, drop = F] verwenden. Gibt es etwas ähnliches in numpy. Ich konnte es in der Dokumentation nicht finden und sah keine ähnliche Frage.
Vielen Dank!
x[None, 10]
wird machen was du willst.None
Stellen Sie Ihr s neben die Dims, die Sie hacken.b
; es sollte seinb = np.zeros((100,10))
.X[10,None]
(am Beispiel Ihres Codes).np.matmul()
oder@
) mit Sicherheit völlig vermasseln . Ich bin gerade davon verbrannt worden.Eine andere Lösung ist zu tun
oder
Die Dimensionalität eines Arrays bleibt erhalten, wenn die Indizierung durch eine Liste (oder ein Array) von Indizes durchgeführt wird. Das ist schön, weil Sie die Wahl haben, die Abmessung beizubehalten und zu drücken.
quelle
x = np.array([[1,2,3,4]])
Wenn Sie es dann mit schneiden, erhaltenx[[0],[1,2]]
Sie die eindimensionale.array([2, 3])
Meiner Meinung nach ist es bei der Auswahl von Spalten- oder Zeilenvektoren am besten, das Slice einfach zu machen und dann zu verwendennp.reshape
. In meinem Beispiel wäre es alsonp.reshape(x[0,[1,2]],[1,2])
X[[10]]
dies so interpretiert wird, dass dieX[10]
Form kleiner ist; ähnlichX[[10, 20]] == X[10, 20]
und Form ist noch kleinera
von Form hatten(10, 20, 30)
, danna[0, :, [0]]
haben Sie Form(1, 20)
, nicht(20, 1)
, weil in letzteren Indizes gesendet werden, zua[[0], :, [0]]
denen oft nicht ganz das ist, was Sie erwarten! Währenda[0, :, :1]
wird Ihnen(20, 1)
wie erwartet geben. Lesen Sie außerdem den obigen Kommentar für einen seltsamen Randfall mit einem einzelnen Index. Insgesamt scheint diese Methode zu viele Randfälle zu haben.Ich habe ein paar vernünftige Lösungen gefunden.
1) verwenden
numpy.take(X,[10],0)
2) Verwenden Sie diese seltsame Indizierung
X[10:11:, :]
Im Idealfall sollte dies die Standardeinstellung sein. Ich habe nie verstanden, warum Dimensionen jemals fallen gelassen werden. Aber das ist eine Diskussion für Numpy ...
quelle
alist[0]
und beim Schneiden beibehalten.slice(n, n+1)
zum Extrahieren des Index geschrieben werden kannn
) sollte die akzeptierte Antwort sein, da sie die einzige ist, die sich natürlich auf den n-dimensionalen Fall erstreckt.X[10:11, :]
in Python 3.7.5 geschrieben werden zu können (dh ohne den zusätzlichen Doppelpunkt nach dem 11.)Hier ist eine Alternative, die mir besser gefällt. Anstatt mit einer einzelnen Zahl zu indizieren, indizieren Sie mit einem Bereich. Das heißt, verwenden
X[10:11,:]
. (Beachten Sie, dass10:11
11 nicht enthalten ist).Dies macht es einfach, auch mit mehr Dimensionen zu verstehen, ohne zu
None
jonglieren und herauszufinden, welche Achse welchen Index verwenden soll. Außerdem müssen Sie keine zusätzliche Buchhaltung in Bezug auf die Arraygröße durchführen, nuri:i+1
für allei
, die Sie für die reguläre Indizierung verwendet hätten.quelle
Um die Lösung zu erweitern, die die Indizierung nach Listen oder Arrays nach gnebehay umfasst, können auch Tupel verwendet werden:
quelle
Dies ist besonders ärgerlich, wenn Sie nach einem Array indizieren, das zur Laufzeit möglicherweise die Länge 1 hat. Für diesen Fall gibt es
np.ix_
:quelle