Python: Aktualisieren einer Liste oder eines Arrays innerhalb einer while-Schleife

Arthur Radley

Ich habe ein numpy-Array von numpy-Arrays (würde gerne mit einer Liste von numpy-Arrays arbeiten), und ich möchte das gesamte Array bearbeiten. Genauer gesagt überprüfe ich, ob Arrays (innerhalb des größeren Arrays) Werte teilen, und wenn ja, entferne ich die gemeinsamen Werte aus dem kleineren Array.

Das Problem, das ich habe, ist, dass, wenn ich versuche, die geänderten Arrays wieder in das allumfassende Array einzufügen, sich die endgültige Ausgabe nach Abschluss der while-Schleife nicht an die aktualisierten Module erinnert.

Ich glaube, dies hat etwas mit Python-Nuancen von Kopier- / Ansichtselementen zu tun, und wenn ich auf Element i oder j des gesamten Arrays zugreife, erstelle ich ein neues Objekt innerhalb der while-Schleife, anstatt das Element innerhalb des größeren Arrays zu bearbeiten . Ich gebe jedoch gerne zu, dass ich das nicht ganz verstehe und mir trotz stundenlanger Versuche definitiv keine Alternative vorstellen kann.

#Feature_Modules is an array (or list) of number arrays, each containing a set of integers
i = 0
j = 0
while i < Feature_Modules.shape[0]: # Check element i against every other element j
    if i != j:
        Ref_Module = Feature_Modules[i]
        while j < Feature_Modules.shape[0]:
            if i != j:
                Query_Module = Feature_Modules[j]
                if np.array_equal(np.sort(Ref_Module),np.sort(Query_Module)) == 1: # If modules contain exactly the same integers, delete one of this. This bit actually works and is outputted at the end.
                    Feature_Modules = np.delete(Feature_Modules,j)
                Shared_Features = np.intersect1d(Ref_Module, Query_Module)
                if Shared_Features.shape[0] > 0 and np.array_equal(np.sort(Ref_Module),np.sort(Query_Module)) == 0: # If the modules share elements, remove the shared elements from the smaller module. This is the bit that isn't outputted in the final Feature_Modules object.
                    Module_Cardinalities = np.array([Ref_Module.shape[0],Query_Module.shape[0]])
                    Smaller_Group = np.where(Module_Cardinalities == np.min(Module_Cardinalities))[0][0]
                    New_Groups = np.array([Ref_Module,Query_Module])
                    New_Groups[Smaller_Group] = np.delete(New_Groups[Smaller_Group],np.where(np.isin(New_Groups[Smaller_Group],Shared_Features) == 1))
                    Feature_Modules = Feature_Modules.copy()
                    Feature_Modules[i] = New_Groups[0] # Replace the current module of Feature_Modules with the new module (Isn't outputted at end of while loops)
                    Feature_Modules[j] = New_Groups[1] # Replace the current module of Feature_Modules with the new module (Isn't outputted at end of while loops)
                else:
                    j = j + 1
            else:
                j = j + 1
    else:
        i = i + 1
    i = i + 1

Wenn wir also diesen kleinen Datensatz als Beispiel verwenden,

Feature_Modules = np.array([np.array([1,2,3,4,5,6,7,8]),np.array([9,10,1,2,3,4]), np.array([20,21,22,23])])

Die neuen Feature_Modules sollten sein;

Feature_Modules = np.array([np.array([1,2,3,4,5,6,7,8]), np.array([9,10]), np.array([20,21,22,23])])

da die gemeinsamen Werte in [0] und [1] des Arrays aus dem [1] entfernt wurden, da es das kleinere Array war.

Crivella

Ich würde vorschlagen, einen mehr Python-X-numpy-Ansatz für den Code zu verwenden:

import numpy as np

Feature_Modules = np.array([np.array([1,2,3,4,5,6,7,8]), np.array([9,10,1,2,3,4]), np.array([20,21,22,23])])

for n1,arr1 in enumerate(Feature_Modules[:-1]):
    l1 = len(arr1)
    for n2,arr2 in enumerate(Feature_Modules[n1+1:]):
        l2 = len(arr2)
        intersect, ind1, ind2 = np.intersect1d(arr1, arr2, return_indices=True)
        if len(intersect) == 0:
            continue
        if l1 > l2:
            Feature_Modules[n2+n1+1] = np.delete(arr2, ind2)
        else:
            Feature_Modules[n1] = np.delete(arr1, ind1)

# [array([1, 2, 3, 4, 5, 6, 7, 8]) array([ 9, 10]) array([20, 21, 22, 23])]

BEARBEITEN:

Dieser Code bearbeitet das ursprüngliche Array, um die Liste zu verfolgen, aus der bereits Elemente entfernt wurden. Wenn Sie das ursprüngliche Array nicht anhängen möchten, erstellen Sie einfach eine Kopie davon:

copy = np.array(original)

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Aktualisieren des Datenrahmens in Python innerhalb einer While-Schleife

Aktualisieren einer Liste innerhalb eines Tupels

Ausführen eines try innerhalb einer while-Schleife in Python

Aktualisieren einer Liste in Python: Warum ist der Umfang meiner for-Schleife innerhalb einer Funktion scheinbar global?

Verwenden des logischen ODER-Operators innerhalb einer Schleife zum Sortieren eines Arrays

Drucken eines Arrays in einer while-Schleife

Erstellen einer durch Pipes getrennten Liste oder eines Arrays in Python

Produkt einer Liste oder eines Arrays in Kotlin

Unity - WaitForSeconds funktioniert nicht innerhalb eines Updates oder einer Schleife

So aktualisieren Sie die Elemente eines Arrays in einer for-Schleife

Unerwartet [ beim Definieren eines Arrays innerhalb einer Schleife

Schneiden eines NumPy-Arrays innerhalb einer Schleife

Ändern eines Werts innerhalb des Arrays in einer forEach()-Schleife

Aktualisieren von Matplotlib-Figuren innerhalb einer for-Schleife in Python

Erstellen Sie eine einfache Liste innerhalb einer while-Schleife Python

Aktualisieren der Datencursorposition innerhalb einer Schleife

Aktualisieren Sie eine Variable innerhalb einer Schleife

Pyplot-Legende innerhalb einer Schleife aktualisieren

Zugreifen auf Werte innerhalb einer Liste innerhalb eines Dict Python

Wie wählt man Werte aus einer Liste innerhalb eines Bereichs mit der while- und if-Schleife aus?

Aktualisieren eines Eigenschaftsfelds in einer Liste

Erstellen eines Arrays aus einer while-Schleife

Kopieren eines Arrays in ein anderes mithilfe einer while-Schleife

Erstellen eines Arrays mit einer Do While-Schleife (Eingabevalidierung)

Verwenden eines Arrays einer Struktur außerhalb oder einer Funktion und einer do / catch-Schleife

Übergeben eines Arrays / einer Liste an Python

Aufrufen eines Werts in einer Liste mithilfe der While-Schleife

Erstellen einer Liste oder eines Arrays von Objekten in Ruby on Rails

Übergeben eines Arrays oder einer Liste an @Pathvariable - Spring / Java