Ich bin verrückt geworden, um herauszufinden, was für eine dumme Sache ich hier falsch mache.
Ich verwende NumPy und habe bestimmte Zeilenindizes und bestimmte Spaltenindizes, aus denen ich auswählen möchte. Hier ist der Kern meines Problems:
import numpy as np
a = np.arange(20).reshape((5,4))
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15],
# [16, 17, 18, 19]])
# If I select certain rows, it works
print a[[0, 1, 3], :]
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [12, 13, 14, 15]])
# If I select certain rows and a single column, it works
print a[[0, 1, 3], 2]
# array([ 2, 6, 14])
# But if I select certain rows AND certain columns, it fails
print a[[0,1,3], [0,2]]
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# ValueError: shape mismatch: objects cannot be broadcast to a single shape
Warum passiert dies? Sicherlich sollte ich in der Lage sein, die 1., 2. und 4. Zeile sowie die 1. und 3. Spalte auszuwählen? Das erwartete Ergebnis ist:
a[[0,1,3], [0,2]] => [[0, 2],
[4, 6],
[12, 14]]
Antworten:
Für eine ausgefallene Indizierung müssen Sie alle Indizes für jede Dimension angeben. Sie geben 3 Indizes für den ersten und nur 2 für den zweiten an, daher der Fehler. Sie möchten so etwas tun:
Das ist natürlich ein Problem beim Schreiben, sodass Sie sich vom Rundfunk helfen lassen können:
Dies ist viel einfacher, wenn Sie mit Arrays indizieren, nicht mit Listen:
quelle
Wie Toan vermuten läßt, wäre ein einfacher Hack nur die Zeilen zuerst wählen und dann die Spalten über wählen , dass .
[Bearbeiten] Die integrierte Methode:
np.ix_
Ich habe kürzlich entdeckt, dass Numpy Ihnen einen eingebauten Einzeiler bietet, mit dem Sie genau das tun können , was @Jaime vorgeschlagen hat, ohne jedoch die Broadcast-Syntax verwenden zu müssen (die unter mangelnder Lesbarkeit leidet). Aus den Dokumenten:
Also benutzt du es so:
Und so funktioniert es, dass Arrays so ausgerichtet werden, wie Jaime es vorgeschlagen hat, damit die Übertragung ordnungsgemäß erfolgt:
Wie MikeC in einem Kommentar sagt,
np.ix_
hat es auch den Vorteil, eine Ansicht zurückzugeben, was meine erste (vorbearbeitete) Antwort nicht tat. Dies bedeutet, dass Sie jetzt dem indizierten Array zuweisen können :quelle
np.ix_
, dass die Auswahl der ersten Spalten und dann der Zeilen schneller ist als die Methode zur Auswahl der ersten Spalten und dann der Zeilen (normalerweise etwa doppelt so schnell wie bei meinen Tests mit quadratischen Arrays der Größen 1K-10K, bei denen Sie alle Zeilen und Spalten neu indizieren).VERWENDEN:
ODER:
quelle
Die Verwendung
np.ix_
ist der bequemste Weg, dies zu tun (wie von anderen beantwortet), aber hier ist ein anderer interessanter Weg, dies zu tun:quelle