430 Stimmen

Unterschied zwischen der numpy.array-Form (R, 1) und (R,)

In numpy, einige Operationen geben das Format (R, 1) zurück, aber einige geben (R,) zurück. Dadurch wird die Matrixmultiplikation aufwendiger, da eine explizite reshape erforderlich ist. Zum Beispiel, gegeben eine Matrix M, wenn wir numpy.dot(M[:,0], numpy.ones((1, R))) machen möchten, wobei R die Anzahl der Zeilen ist (natürlich tritt das gleiche Problem auch spaltenweise auf). Es wird ein Fehler matrices are not aligned angezeigt, da M[:,0] das Format (R,) hat, jedoch numpy.ones((1, R)) das Format (1, R) hat.

Also meine Fragen sind:

  1. Was ist der Unterschied zwischen dem Format (R, 1) und (R,). Ich weiß, dass es sich buchstäblich um eine Liste von Zahlen und eine Liste von Listen handelt, wobei jede Liste nur eine Zahl enthält. Ich frage mich nur, warum numpy nicht so gestaltet ist, dass es das Format (R, 1) bevorzugt, anstelle von (R,), um die Matrixmultiplikation einfacher zu machen.

  2. Gibt es bessere Möglichkeiten für das obige Beispiel? Ohne explizites Umformen wie folgt: numpy.dot(M[:,0].reshape(R, 1), numpy.ones((1, R)))

3voto

Palak Bansal Punkte 761

Die Datenstruktur der Form (n,) wird als Rang-1-Array bezeichnet. Es verhält sich nicht konsistent wie ein Zeilenvektor oder ein Spaltenvektor, was einige seiner Operationen und Effekte nicht intuitiv macht. Wenn Sie die Transponierte dieser (n,) Datenstruktur nehmen, wird sie genau gleich aussehen und das Skalarprodukt wird Ihnen eine Zahl und keine Matrix geben. Die Vektoren der Form (n,1) oder (1,n) Zeilen- oder Spaltenvektoren sind viel intuitiver und konsistenter.

1voto

bogatron Punkte 18119

1) Der Grund, warum man eine Form von (R, 1) gegenüber (R,) nicht bevorzugen sollte, ist, dass es die Dinge unnötig kompliziert macht. Außerdem, warum wäre es bevorzugt, die Form (R, 1) standardmäßig für einen Vektor der Länge R anstatt von (1, R) zu haben? Es ist besser, es einfach zu halten und explizit zu sein, wenn zusätzliche Dimensionen erforderlich sind.

2) Für dein Beispiel, bei dem du ein äußeres Produkt berechnest, kannst du dies ohne einen reshape-Aufruf machen, indem du np.outer verwendest:

np.outer(M[:,0], numpy.ones((1, R)))

1voto

Jesse H. Punkte 315

Um es klar zu sagen, wir sprechen über:

  • ein NumPy-Array, auch bekannt als numpy.ndarray
  • die Form eines Arrays, bekannt als numpy.ndarray.shape
  • die Frage geht von einem unbekannten numpy.ndarray mit der Form (R,) aus, wobei R als Länge seiner jeweiligen Dimension verstanden werden sollte

NumPy-Arrays haben eine Form. Diese .shape wird durch ein Tupel dargestellt, bei dem jedes Element im Tupel uns die Länge dieser Dimension angibt. Um es einfach zu halten, bleiben wir bei Zeilen und Spalten. Während die Werte unseres numpy.ndarray in den folgenden Beispielen nicht verändern werden, wird die Form dies tun.

Betrachten wir ein Array mit den Werten 1, 2, 3 und 4.

Unsere Beispiele beinhalten die folgenden .shape-Darstellungen:

(4,)  # 1-dimensionales Array mit Länge 4
(1,4) # 2-dimensionales Array mit einer Zeilenlänge von 1 und einer Spaltenlänge von 4
(4,1) # 2-dimensionales Array mit einer Zeilenlänge von 4 und einer Spaltenlänge von 1

Wir können dies abstrakter mit den Variablen a und b betrachten.

(a,)  # 1-dimensionales Array mit Länge a
(b,a) # 2-dimensionales Array mit einer Zeilenlänge von b und einer Spaltenlänge von a
(a,b) # 2-dimensionales Array mit einer Zeilenlänge von a und einer Spaltenlänge von b

Für mich ist es hilfreich, diese 'manuell' aufzubauen, um ein besseres Verständnis dafür zu bekommen, was ihre Dimensionen bedeuten.

>> # (4,)
>> eindimensionaler Vektor = np.array(
    [1, 2, 3, 4]
)

>> # (1,4)
>> Zeilenvektor = np.array(
    [
        [1, 2, 3, 4]
    ]
)

>> # (4,1)
>> Spaltenvektor = np.array(
    [
        [1], 
        [2], 
        [3], 
        [4]
    ]
)

Also, die Antwort auf die erste Frage:

  1. Was ist der Unterschied zwischen der Form (R, 1) und (R,)?

Antwort: Sie haben unterschiedliche Dimensionen. a ist die Länge der einen Dimension und b die Länge einer anderen, .shape ist jeweils (a, b) und (a,). b ist einfach zufällig 1. Eine Möglichkeit, dies zu betrachten, ist: Wenn a = 1 ist, dann hat die Zeile die Länge 1 und es handelt sich also um einen Zeilenvektor. Wenn b = 1 ist, dann hat die Spalte die Länge 1 und das numpy.ndarray, das es repräsentiert, ist ein Spaltenvektor.

  1. Gibt es bessere Möglichkeiten für das obige Beispiel?

Antwort: Angenommen, wir haben das Array, das ich oben als Beispiel mit den Werten 1, 2, 3 und 4 verwendet habe. Eine praktische Möglichkeit, (R,) zu (R, 1) zu machen, ist folgende:

>> eindimensionales_array = np.array([1,2,3,4])
>> eindimensionales_array.shape
(4,)
>> Zeilenvektor = eindimensionales_array[:, None]
>> Zeilenvektor.shape
(4, 1)

Ressourcen

  1. NumPy — ndarrays — https://numpy.org/doc/stable/reference/arrays.ndarray.html
  2. Cross Validated @unutbu — Dimensionstrick — https://stats.stackexchange.com/a/285005

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X