Was ist der schnellste Weg, um zwei Spalten und die gleichen Zeilen einer 2D-Matrix zu tauschen?

Ich habe ein Problem, in dem ich eine optimale Permutation der Spalten / Zeilen finden muss. Also, wenn ich die Spalte i mit Spalte j tausche, muss ich die Zeile i und die Zeile j tauschen. Die Punktzahl wird auf die resultierende Matrix angewendet (simuliertes Glühen).

Es funktioniert, aber ich frage mich, ob es schneller sein könnte.

Was ich mache

#!/usr/bin/env python """Swap rows and colums of a square integer matrix simultaneously.""" import numpy as np import random random.seed(0) def swap(cm, i, j): """ Swap row and column i and j in-place. Examples -------- >>> cm = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> swap(cm, 2, 0) array([[8, 7, 6], [5, 4, 3], [2, 1, 0]]) """ # swap columns copy = cm[:, i].copy() cm[:, i] = cm[:, j] cm[:, j] = copy # swap rows copy = cm[i, :].copy() cm[i, :] = cm[j, :] cm[j, :] = copy return cm def main(n): import time cm = np.random.randint(0, 150000, size=(n, n)) swaps = 10**6 t0 = time.time() for step in range(swaps): # Choose what to swap i = random.randint(0, n - 1) j = i while j == i: j = random.randint(0, n - 1) cm = swap(cm, i, j) t1 = time.time() print("{:0.2f} swaps / sec".format(swaps / (t1 - t0))) if __name__ == '__main__': import doctest doctest.testmod() main(369) 

Was ich versucht habe

  • Der Code ist wie folgt: 152642.58 Swaps / Sek – 158248.08 Swaps / Sek
  • cm[:, [i, j]] = cm[:, [j, i]] zum Austauschen der Spalten: 90562.43 Swaps / Sek – 97625.79 Swaps / Sek

One Solution collect form web for “Was ist der schnellste Weg, um zwei Spalten und die gleichen Zeilen einer 2D-Matrix zu tauschen?”

Nur eine kleine Verbesserung:

 def swap(cm, i, j): # swap columns cm[:, i], cm[:, j] = cm[:, j], cm[:, i] # swap rows cm[i, :], cm[j, :] = cm[j, :], cm[i, :] return cm 

Original: 57807.71 Swaps / Sek – 70489,96 Swaps / Sek

Dieser Code: 60762,03 Swaps / Sek – 87411,49 Swaps / Sek

  • Beste Weg, um wiederholten Parameter zu einer Numpy vectorized Funktion zu übergeben
  • Optimierungsalgorithmus (Dog-Bein-Trust-Region) in Matlab und Python
  • Schnelle Unterschiede aller Reihenpaare mit NumPy
  • Scipy Kurve passenden negativen Wert
  • Vectorize oder Optimierung einer Schleife, bei der jede Iteration vom Zustand der vorherigen Iteration abhängt
  • Warum nutzt python nicht __iadd__ für Summe und angekettete Betreiber?
  • Schneller Weg, um ein paar Elemente aus einer Liste / Warteschlange zu entfernen
  • CPython String Addition Optimierung Fehler Fall
  • Python datetime.strptime () Essen viel CPU-Zeit
  • Schnelle Tensorrotation mit NumPy
  • String-Verkettung ohne '+' Operator in Python
  • Python ist die beste Programmiersprache der Welt.