Ich arbeite mit einer großen Reihe von 1 und muss systematisch Nullen aus Abschnitten des Arrays entfernen. Das große Array besteht aus vielen kleineren Arrays, für jedes kleinere Array muss ich seine oberen und unteren Dreiecke systematisch durch 0 ersetzen. Zum Beispiel haben wir ein Array mit 5 Subarrays durch den Indexwert angegeben (alle Unterfelder die gleiche Anzahl von Spalten haben):Iterating und Modifizierung von Datenrahmen mit Pandas groupby
0 1 2
0 1.0 1.0 1.0
1 1.0 1.0 1.0
1 1.0 1.0 1.0
2 1.0 1.0 1.0
2 1.0 1.0 1.0
2 1.0 1.0 1.0
3 1.0 1.0 1.0
3 1.0 1.0 1.0
3 1.0 1.0 1.0
3 1.0 1.0 1.0
4 1.0 1.0 1.0
4 1.0 1.0 1.0
4 1.0 1.0 1.0
4 1.0 1.0 1.0
4 1.0 1.0 1.0
Ich mag jede Zeilengruppe in ihrem oberen und unteren Dreieck modifiziert werden ich verwende nur numpy dieses resultierende Array zu erreichen, aber ich denke, ich es
0 1 2
0 1.0 1.0 1.0
1 1.0 1.0 0.0
1 0.0 1.0 1.0
2 1.0 0.0 0.0
2 0.0 1.0 0.0
2 0.0 0.0 1.0
3 1.0 0.0 0.0
3 1.0 1.0 0.0
3 0.0 1.0 1.0
3 0.0 0.0 1.0
4 1.0 0.0 0.0
4 1.0 1.0 0.0
4 1.0 1.0 1.0
4 0.0 1.0 1.0
4 0.0 0.0 1.0
im Moment beschleunigen kann Pandas Gruppierung mit bis: so dass die resultierenden Matrix ist. In Wirklichkeit ist mein Datensatz sehr groß, fast 500.000 Zeilen lang. Der numpy Code ist unten:
import numpy as np
candidateLengths = np.array([1,2,3,4,5])
centroidLength =3
smallPaths = [min(l,centroidLength) for l in candidateLengths]
# This is the k_values of zeros to delete. To be used in np.tri
k_vals = list(map(lambda smallPath: centroidLength - (smallPath), smallPaths))
maskArray = np.ones((np.sum(candidateLengths), centroidLength))
startPos = 0
endPos = 0
for canNo, canLen in enumerate(candidateLengths):
a = np.ones((canLen, centroidLength))
a *= np.tri(*a.shape, dtype=np.bool, k=k_vals[canNo])
b = np.fliplr(np.flipud(a))
c = a*b
endPos = startPos + canLen
maskArray[startPos:endPos, :] = c
startPos = endPos
print(maskArray)
Als ich dieser Datensatz auf meinem realen führen Sie es fast 5-7secs auszuführen nimmt. Ich denke, das liegt an dieser massiven for-Schleife. Wie kann ich Pandas-Gruppierungen verwenden, um eine höhere Geschwindigkeit zu erreichen? Dank
Hallo @piRSquared danke, dafür. Ich denke, dass die von Ihnen zur Verfügung gestellte Lösung im Vergleich zu der for-Schleife, die ich ursprünglich geschrieben habe, langsam ist. Ich denke, unter der Haube läuft man fast wie eine For-Schleife durch. Wenn Sie es mit candidateLengths = np.random.randint (1,7, size = 300000) versuchen, finde ich, dass mein Code in 6 Sekunden ausgeführt wird. Vielen Dank! – kPow989
@ user3063482 versuchen Sie das. – piRSquared
Hallo, danke ich habe es zeitlich abgestimmt und deine neue Funktion kehrt in 3.74s zurück während meine in 5.34s! Das funktioniert ziemlich gut. Schätze die Hilfe! – kPow989