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 
  • Wie man eine einfache für Schleife in Python / Numpy vektorisiert
  • Vektorisierte Look-up von Werten in Pandas dataframe
  • Python-Pandas berechnen Rolling Beta mit Walzen gelten für Groupby-Objekt in vektorisierte Weise
  • Wie gebe ich die Funktion auf das Drittel-Dimension-Array effektiv mit numpy?
  • Kovarianz mit Säulen
  • Schnelles Berechnen von Eigenvektoren für jedes Element eines Arrays in Python
  • Wie kann ich diesen Python-Code vektorisieren?
  • Schnellste Weg, um Wörterbuch von Summen in numpy in 1 I / O Pass zu extrahieren
  • Vergleich des einzelnen Dataframe-Wertes mit vorherigen 10 in derselben Spalte
  • Ändern von etwas von Iteration über ein numpy Array zu Vektorisierung
  • Pandas: Umformung von Daten
  • Python ist die beste Programmiersprache der Welt.