Array in Array platzieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Guten Tag zusammen,

ich habe eine Menge an Koordinaten vorliegen, deren Format ich beeinflussen kann. Also wahlweise:

Code: Alles auswählen

koordinaten = np.array([[x1, y1], [x2, y2], ... [xn, yn]])
# oder 
x = np.array([x1, x2, ... xn])
y = np.array([y1, y2, ... yn])
Dann habe ich ein großes Array (konkrete Größe variabel von Fall zu Fall):

Code: Alles auswählen

welt = np.zeros((2000, 2000))
und ein weiteres Array beliebiger Form (in der Regel jedoch ein Kreis), beispielsweise:

Code: Alles auswählen

form = np.array([0, 1, 0], [1, 1, 1], [0, 1, 0])
Wie kann ich nun schnell an den Stellen im Array `welt`, welche in den Koordinaten beschrieben werden, das Array `form` mittig einfügen und auf die bereits vorhandenen Werte addieren?
Da mir nichts besseres einfiel, ist der bisherige Ansatz die Koordinaten in einer Schleife zu durchlaufen und dann per Slicing den Bereich der Form zu nehmen und darauf die Form zu addieren. Das sieht dann so aus:

Code: Alles auswählen

for koordinate in koordinaten:
    welt[koordinate[0] - form.shape[0] : koordinate[0] + form.shape[0] + 1, koordinate[1] - form.shape[1] : koordinate[1] + form.shape[1] + 1] += form
Da es sich um ein paar mehr Koordinaten handelt (mindestens ~100.000) würde ich das ganze gern möglichst schnell verarbeiten und suche nach einer klugen Numpy-Funktion dafür. Je nachdem wie schnell das ganze geht, würden es nämlich mehr Punkte werden. Momentan läuft das Programm mit numba beschleunigt und braucht ca. 5,4 s für 129.600 Punkte mit einer `welt` mit Shape (512, 512) und einer `form` mit Shape (61, 61).
Weiß jemand Rat?
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Falls jemand an einer möglichen Lösung interessiert ist:

Code: Alles auswählen

import numpy as np
import scipy.ndimage

koordinaten = np.array([[5, 5], [0, 0], [10, 10], [2, 7], [2, 8], [2, 8]])
form = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]])
uniques, counts = np.unique(koordinaten, return_counts=True, axis=0)
welt = np.zeros((11, 11))
welt[uniques[:, 0], uniques[:, 1]] = counts
welt = scipy.ndimage.convolve(welt, form, mode="constant")
Das funktioniert halbwegs zügig.
Antworten