Gibt es einen besseren Weg, um Cross-Mapping-Indizien für numpy Arrays zu bestimmen

Ich brauche die Cross-mapped Indizien für numpy Union und Kreuzung Operationen. Der Code, den ich unten habe, funktioniert gut, aber ich möchte es vektorisieren, bevor ich ihn auf große Datensätze anwende. Oder, wenn es eine bessere, eingebaute, Weg dann was ist es?

# ------- define the arrays and set operations --------- A = np.array(['a','b','c','e','f','g','h','j']) B = np.array(['h','i','j','k','m']) C = np.union1d(A, B) D = np.intersect1d(A,B) # ------- get the mapped indicies for the union ---- zc = np.empty((len(C),3,)) zc[:]=np.nan zc[:,0] = range(0,len(C)) for iy in range(0,len(C)): for ix in range(0, len(A)): if A[ix] == C[iy]: zc[iy,1] = ix for ix in range(0, len(B)): if B[ix] == C[iy]: zc[iy,2] = ix # ------- get the mapped indicies for the intersection ---- zd = np.empty((len(D),3,)) zd[:]=np.nan zd[:,0] = range(0,len(D)) for iy in range(0,len(D)): for ix in range(0, len(A)): if A[ix] == D[iy]: zd[iy,1] = ix for ix in range(0, len(B)): if B[ix] == D[iy]: zd[iy,2] = ix 

One Solution collect form web for “Gibt es einen besseren Weg, um Cross-Mapping-Indizien für numpy Arrays zu bestimmen”

Für Fälle wie diese, möchten Sie vielleicht die Saiten in Ziffern umwandeln, da die Arbeit mit ihnen ist viel effizienter. Auch angesichts der Tatsache, dass die Ausgänge numerische Arrays sind, macht es mehr Sinn, sie als numerische IDs im Voraus zu haben. Nun, für diese Umwandlung in numerische IDs habe ich Leute gesehen, die lambda unter anderen Ansätzen verwenden, aber ich würde mit np.unique gehen, was für solche Fälle sehr effizient ist. Hier ist die Implementierung beginnend mit der numerischen ID-Konvertierung –

 # ------------------------ Setup work ------------------------------- _,idx1 = np.unique(np.append(A,B),return_inverse=True) A_ID = idx1[:A.size] B_ID = idx1[A.size:] # ------------------------ Union work ------------------------------- # Get length of zc, which would be the max of ID+1. lenC = idx1.max()+1 # Initialize output array zc and fill with NaNs. zc1 = np.empty((lenC,3,)) zc1[:]=np.nan # Fill first column with consecutive numbers starting with 0 zc1[:,0] = range(0,lenC) # Most important part of the code : # Set the cols-1,2 at places specified by IDs from A and B respectively # with values from 0 to the extent of the respective IDs zc1[A_ID,1] = np.arange(A_ID.size) zc1[B_ID,2] = np.arange(B_ID.size) # ------------------------ Intersection work ------------------------------- # Get intersecting indices between A and B intersect_ID = np.argwhere(A_ID[:,None] == B_ID) # Initialize output zd based on the number of interesects lenD = intersect_ID.shape[0] zd1 = np.empty((lenD,3,)) zd1[:] = np.nan # Fill first column with consecutive numbers starting with 0 zd1[:,0] = range(0,lenD) zd1[:,1:] = intersect_ID 
  • Machen Sie 2D Numpy Array aus Koordinaten
  • Was zu ersetzen Loops und verschachtelt, wenn Sätze mit, um zu beschleunigen Python-Code?
  • Berechnen der Anzahl spezifischer aufeinander folgender gleicher Werte in vektorisierter Weise in Pandas
  • Suche nach Kreuzung von zwei Matrizen in Python innerhalb einer Toleranz?
  • Wie gebe ich die Funktion auf das Drittel-Dimension-Array effektiv mit numpy?
  • Machen Sie ein numpy Array monoton ohne Python Loop
  • Wie finde ich alle Elemente in einem numpy 2-dimensionalen Array, das mit einer bestimmten Liste übereinstimmt?
  • Wie kann ich dieses sehr einfache Stück "Game of Life" -Kode reparieren und optimieren, indem ich die Funktionalität von NumPy nutzt?
  • Kovarianz mit Säulen
  • NumPy: vektorisieren Summe von Abständen zu einem Satz von Punkten
  • Numpy vectorize und atomare Vektoren
  • Python ist die beste Programmiersprache der Welt.