2017-12-29 2 views
0

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?

+1

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

+0

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

+0

@ 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

Antwort

1

Das Übergeben eines sehr großen Arrays in eine Funktion ist so günstig wie das Übergeben von irgendetwas anderem. Es wird als Referenz weitergegeben, nicht kopiert, sodass alle Mutationen, die von der Funktion ausgeführt werden, erhalten bleiben.

Sie können auch nur auf Namen im äußeren Bereich verweisen (global oder nicht), es sei denn, Sie versuchen, einen Namen zuzuweisen. So sollte pix[...] = ... nur innerhalb func arbeiten.

Verwandte Themen