[PYTHON] Erstellen Sie eine Distanzmatrix

Abstand zwischen Punkten

In Numpy ist die Verwendung von Schleifen langsam, daher werden verschiedene Techniken verwendet. Es ist einfach, im Vektor- oder Matrixformat zu schreiben, aber es gibt einige, die Broadcast verwenden. Ein Beispiel ist die Erzeugung einer Distanzmatrix. Wie berechnen Sie den Abstand zwischen den Standorten mehrerer Standorte, die in "x" gespeichert sind?

Loop vorerst

Ich bin seit vielen Jahren mit Fortran vertraut, daher möchte ich mit Schleifen schreiben.

do j = 1, n
  do i = 1, n
    r(i, j) = sqrt((x(i) - x(j))**2)
  end do
end do

Wörtlich übersetzt in Python

for i in range(len(x)):
    for j in range(len(x)):
        r[i, j] = math.sqrt((x[i] - x[j])**2)

Es wird sein. Selbst mit ndarray gibt es keinen Unterschied, ob die Länge etwa 10 beträgt, sondern es ist schneller, die Liste zu führen.

Übertragung

Die Array-Operationen von Numpy (einschließlich Produkte) erfolgen grundsätzlich Element für Element. Operationen an Arrays derselben Form, wie z. B. zweidimensionale 4x3-Arrays, werden an jedem Element ausgeführt. Für Elemente mit unterschiedlichen Größen, wie z. B. ein zweidimensionales 4x3-Array und ein eindimensionales 1x3-Array, wird die Berechnung unter der Annahme durchgeführt, dass die Zeilen des eindimensionalen Arrays wiederholt werden, sodass die Größen gleich sind. Diese Konvertierung wird als "Broadcast" bezeichnet.

Für das "x", das die Position speichert, scheint es, dass ein Array zurückgegeben wird, wenn die Operation mit der Translokation ausgeführt wird, aber das ist nicht der Fall. Es wird als dieselbe Form angesehen und ist eine Liste von 0.

Erhöhen Sie die Abmessung

Erhöhen Sie eine Dimension, um mithilfe von Broadcast die gewünschte Entfernungsmatrix ohne Schleifen zu generieren. Verwenden Sie np.newaxis, um die Dimension zu vergrößern. Gleiches gilt für "Keine". Die Länge der Abmessung, für die "np.newaxis" oder "None" angegeben ist, beträgt 1. Obwohl ich es noch nie benutzt habe, hat Fortran95 eine eingebaute Funktion namens "Spread".

np.sqrt((x - x[:, np.newaxis])**2)

Sie können auch nx1- und 1xn-Operationen verwenden.

np.sqrt((x[np.newaxis, :] - x[:, np.newaxis])**2)

In meiner Umgebung betrug die Schleife von ndarray, gemessen mit "% timeit" für 10 Punkte, 69,1 μs, die Listenschleife 54,1 μs und diejenige, die die Schleife vermieden und die Dimension der Matrix vergrößerte, 3,04 μs. Bei 1000 Punkten betrug die Schleife von ndarray 660 ms und die mit erhöhten Matrixdimensionen 2,47 ms.

n-dimensional

Die Verwendung von "..." entspricht der Anordnung von ":", sodass die Anzahl der Dimensionen der Dimension des Arrays entspricht. Der euklidische Abstand eines Punktes im n-dimensionalen Raum kann wie folgt berechnet werden.

np.sqrt(((x[..., np.newaxis, :] - x[..., :, np.newaxis])**2).sum(axis=0))

Referenz

Recommended Posts

Erstellen Sie eine Distanzmatrix
Lass uns ein Squashspiel machen
Machen Sie einen Funktionsdekorateur
Ich mache ein Passwort!
Machen Sie einen Nyan-Knopf
Mach ein Spiel im Tetris-Stil!
Erstellen Sie einen Base64-Decoder
Machen wir einen Discord Bot.
Erstellen Sie ein Blueqat-Backend ~ Teil 1
[Django] Erstellen Sie ein Pulldown-Menü
Machen Sie einen LINE BOT (Chat)
Erstellen Sie ein Lesezeichen in Python
Machen Sie eine Lotterie mit Python
Machen Sie Responder zu einem Daemon (Dienst)
Machen Sie ein Feuer mit kdeplot
Erstellen Sie einen Berechnungsbohrdruck
Machen wir eine Remote-Rumba [Hardware]
Wie erstelle ich eine japanisch-englische Übersetzung?
Machen Sie eine Santa-Kennung aus einem Santa-Bild
Lassen Sie uns eine Remote-Rumba erstellen [Software]
Machen Sie eine Tweet-Box für Pepper
Machen Sie einen Sound mit Jupyter Notebook
Zeichnen Sie eine Streudiagrammmatrix mit Python
Erstellen Sie mit TensorFlow eine Gesichtserkennung
Wie man einen lockeren Bot macht
Machen wir einen Blockbruch mit wxPython
Machen wir einen Spot Sale Service 1
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
Machen Sie die C-Kompilierung etwas einfacher
Python / Machen Sie ein Diktat aus einer Liste.
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Erstellen Sie ein Empfehlungssystem mit Python
[Blender] So erstellen Sie ein Blender-Plug-In
Machen Sie einen Filter mit einer Django-Vorlage
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Wie erstelle ich einen Crawler?
Erstellen Sie mit PySide einen Modelliterator
Beim Erstellen einer Matrix in einer Liste
Machen Sie eine schöne Grafik mit Plotly
Machen Sie einen Vorhanggenerator mit Blender
[Python] Wie erstelle ich eine Matrix aus sich wiederholenden Mustern (repmat / tile)
Machen wir einen Spot Sale Service 3
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
Machen wir einen Jupyter-Kernel
Machen Sie Jupyter Notebook zu einem Dienst unter CentOS
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
Machen Sie mit matplotlib eine teilweise gezoomte Figur
Machen Sie ein Zeichnungsquiz mit kivy + PyTorch
Lassen Sie uns mit Python langsam sprechen
Erstellen Sie einen Kaskadenklassifizierer mit Google Colaboratory
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Qt für Python App Desktop App
Machst du so etwas wie eine Rakete?
Machen Sie eine Logikschaltung mit Perceptron (Multilayer Perceptron)
Machen Sie Ja Nein Popup mit Kivy