Ich habe ein Array mit etwa 64.000 Features (willkürlich beschriftet 0-64.000), und ich versuche, eine Funktion zu schreiben, die jedes Feature mit jedem seiner Nachbarn vergleichen wird. Um dies iterativ zu tun, braucht es eine prohibitive Menge an Zeit. Ich versuche, den Prozess zu beschleunigen, indem eine verschachtelte Funktion erstellen, die auf jedes Merkmal pandas.DataFrame.apply()
mit dem folgenden Code angewandt werden:Freigeben von Variablen in geschachtelten Funktionen
def textureRemover(pix, labeledPix, ratio):
counter = 0
numElements = numpy.amax(labeledPix)
maxSize = numpy.count_nonzero(labeledPix)
allElements = pandas.DataFrame(numpy.array(list(range(numElements))))
def func(regionID):
...
allElements.apply(func, axis = 1)
return pix
Wo func()
Bedürfnisse auf die Parameter zuzugreifen und Variablen definiert innerhalb, textureRemover()
und global pix, labeledPix, counter, ratio, maxSize
: jeder Anruf von func()
wird die sehr großen Arrays pix
und labeledPix
ich habe versucht, mit der Linie ändern. Allerdings, wenn diese Zeile in textureRemover()
verwenden, erhalte ich einen Fehler, dass Variablen nicht Parameter und global sein können. Und wenn ich die Zeile innerhalb func()
verwende, erhalte ich einen Fehler, dass diese Variablen nicht definiert sind.
Wie kann ich func()
in der Lage, auf diese Variablen zugreifen und ändern?
Es gibt ein paar Fragen hier. Die erste betrifft die Frage, ob die Verwendung von "apply" die Leistung im Vergleich zur Iteration verbessert. Die zweite Möglichkeit besteht in der Verwendung von apply mit einer Funktion, die mehrere Parameter verwendet. Diese sollten in zwei verschiedene Fragen aufgeteilt werden, wobei die letztere eine Antwort [hier] (https://stackoverflow.com/a/12183507/3639023) hat, hoffe das hilft – johnchase
Das Übergeben eines sehr großen Arrays in eine Funktion ist so billig als etwas anderes zu passieren. Es wird als Referenz weitergegeben, nicht kopiert, sodass alle Mutationen, die von der Funktion ausgeführt werden, erhalten bleiben. Sie können auch auf Namen im äußeren Bereich verweisen (global oder nicht), es sei denn, Sie versuchen, einen Namen zuzuweisen. Also sollte 'pix [...] = ...' nur in 'func' funktionieren. – 9000
@ 9000 Ich habe das nicht bemerkt! Ohne irgendetwas als global zu deklarieren, scheint es zu funktionieren. Wenn du das als Antwort postest, kann ich es markieren – asheets