Numpy: Wie Tensorprodukt richtig vektorisieren?
Hi, ich habe ein ndarray points von N × M Punkten in 3D (N, M, 3) und weiter ein ndarray rotations mit N Rotationsmatrizen (N, 3, 3).
Ich möchte nun für jedes N die M Punkte in 3D mit der entsprechenden Matrix rotieren, also:
for n in range(N):
points[n, :, :] = points[n] @ rotations[n].T
# (M, 3) = (M, 3) × (3, 3)
Nur eben ohne den Loop. Gibt es irgendwie einen Weg, das sauber in eine Tensoroperation zu stecken?
1 Antwort
Nein.
Du willst ja am Ende die rotierten Punkte raushaben und nicht etwa irgendeine Summe oder so etwas.
Und du willst nicht etwa jeweils einen Punkt mit mehreren Matrizen multiplizieren sondern viele Punkte mit jeweils einer Matrix.
Wie sollte das shcneller gehen, als entsprchend je eine Matrix und die dazugehörigen Punte zu laden und schlicht zu multiplizieren?
Wenn du da irgendwelche Dopplungen drinnen hättest oder große Leerräume, dann könnte man vielleicht etwas shcneller machen. Aber eine einfache Multiplikation wirst du nicht verschnellern können.
Du solltest aber natürlich schauen, dass du das ganze irgendwie parallel machst, ab einer gewissen Größe am besten auf einer Grafikkarte oder dergleichen.
In Python ohne Parallelisierung ist das echt arschlahm.
Du kannst mal schauen ob np.multiply tut, was du willst, und ob das schnell genug ist.