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.
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.
Lass mich ein paar Worte sagen