Ich habe eine große (ca. 14.000 x 14.000) quadratische Matrix als Numpy ndarray
dargestellt. Ich möchte eine große Anzahl von Zeilen und Spalten extrahieren - die Indizes, von denen ich im Voraus weiß, obwohl es tatsächlich alle Zeilen und Spalten sind, die nicht alle Null sind -, um eine neue quadratische Matrix zu erhalten (ca. 10.000 x 10.000).Was ist der schnellste Weg, um bestimmte Zeilen und Spalten aus einem Numpy NDarray zu extrahieren?
Der schnellste Weg, die ich gefunden habe, dies zu tun ist:
> timeit A[np.ix_(indices, indices)]
1 loops, best of 3: 6.19 s per loop
Dies ist jedoch viel langsamer als die Zeit, die Matrix-Multiplikation zu tun:
> timeit np.multiply(A, A)
1 loops, best of 3: 982 ms per loop
Dies scheint seltsam, da Sowohl die Zeilen-/Spaltenextraktion als auch die Matrixmultiplikation müssen ein neues Array zuweisen (das für das Ergebnis der Matrixmultiplikation noch größer ist als für die Extraktion), aber die Matrixmultiplikation muss auch zusätzliche Berechnungen durchführen.
Also die Frage: Gibt es einen effizienteren Weg, um die Extraktion, insbesondere mindestens so schnell wie Matrixmultiplikation durchzuführen?
Ich vermute, der Grund, warum Matrixmultiplikation schnell ist, liegt darin, dass es alle Elemente des Arrays auf eine streng reguläre Weise verwendet und dafür optimiert wurde. Wenn Sie willkürliche Indizes (d. H. Keine rechteckige Scheibe) übergeben müssen, erhalten Sie keine Höchstgeschwindigkeit. – BrenBarn
ja, benutze numpy 1.9 – seberg
'np.multiply (A, A)' ist * elementweise * Multiplikation. Verwenden Sie 'np.dot (A, A)' für die Matrixmultiplikation. –