Ich möchte ein NumPy nxn-Array in Scheiben schneiden. Ich möchte eine beliebige Auswahl von m Zeilen und Spalten dieses Arrays extrahieren (dh ohne Muster in der Anzahl der Zeilen / Spalten), wodurch es zu einem neuen mxm-Array wird. Nehmen wir für dieses Beispiel an, das Array ist 4x4 und ich möchte ein 2x2-Array daraus extrahieren.
Hier ist unser Array:
from numpy import *
x = range(16)
x = reshape(x,(4,4))
print x
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
Die zu entfernenden Zeilen und Spalten sind identisch. Der einfachste Fall ist, wenn ich eine 2x2-Submatrix extrahieren möchte, die am Anfang oder am Ende steht, dh:
In [33]: x[0:2,0:2]
Out[33]:
array([[0, 1],
[4, 5]])
In [34]: x[2:,2:]
Out[34]:
array([[10, 11],
[14, 15]])
Aber was ist, wenn ich eine andere Mischung aus Zeilen / Spalten entfernen muss? Was ist, wenn ich die erste und dritte Zeile / Zeile entfernen muss, um die Submatrix zu extrahieren [[5,7],[13,15]]
? Es kann eine beliebige Zusammensetzung von Zeilen / Zeilen geben. Ich habe irgendwo gelesen, dass ich mein Array nur mit Arrays / Indexlisten für Zeilen und Spalten indizieren muss, aber das scheint nicht zu funktionieren:
In [35]: x[[1,3],[1,3]]
Out[35]: array([ 5, 15])
Ich habe einen Weg gefunden, nämlich:
In [61]: x[[1,3]][:,[1,3]]
Out[61]:
array([[ 5, 7],
[13, 15]])
Das erste Problem dabei ist, dass es kaum lesbar ist, obwohl ich damit leben kann. Wenn jemand eine bessere Lösung hat, würde ich sie sicherlich gerne hören.
Eine andere Sache ist, dass ich in einem Forum gelesen habe , dass das Indizieren von Arrays mit Arrays NumPy zwingt, eine Kopie des gewünschten Arrays zu erstellen. Bei der Behandlung mit großen Arrays kann dies daher zu einem Problem werden. Warum ist das so / wie funktioniert dieser Mechanismus?