Ich habe zwei numpy Arrays:Effiziente Produkt von 1D-Array und 3D-Array entlang einer Dimension - NumPy
- Ein 1D-Array t Form (70L,) genannt mit dem Element genannt lassen s sagen ti
- A 3D-Array namens I mit Form (70L, 1024L, 1024L), mit jedem Element namens Ii. II sind somit die Dimension (1024L, 1024L)
Ich mag ein Produkt aus dem zwei-Array entlang der ersten Dimension machen, das heißt:
tI = t1*I1,t2*I2,...,tN*IN
wie wieder zu erhalten, ein neues Array von Dimension (70L, 1024L, 1024L) und dann die Summe in der ersten Dimension, um eine Reihe von Dimension (1024L, 1024L) zu erhalten:
tsum = t1*I1 + t2*I2 + ... +tN*IN
Für den Moment mit dem tun des ich bin folgend zufrieden:
tI = np.asarray([t[i]*I[i,:,:] for i in range(t.shape[0])])
tsum = np.sum(tI,axis=0)
Aber es wird ein bisschen langsam sein, wenn die Dimensionen meines Arrays zunehmen. Ich frage mich, ob es eine numpige oder scipy Funktion gibt, mehr für diese spezielle Aufgabe optimiert?
Vielen Dank im Voraus für einen Link oder Informationen.
Greg
Für mich ist 'Tensordot' tatsächlich schneller. – egpbos
@egpbos Haben Sie es mit den gleichen Datenmengen versucht? Ich denke, es könnte die Art sein, wie NumPy während der Installation kompiliert wurde. Für verschiedene Hardware kann es anders funktionieren, meistens eine Schätzung. – Divakar
Ja, ich habe Ihren Testcode kopiert. 'Tensordot' ist für mich durchweg um 35% schneller als'Einsum'. 'In [65]:% Zeiteinheit n.Einsum ('i, ijk-> jk', t, I) 10 Schleifen, das Beste aus 3: 106 ms pro Schleife In [66]:% timeit np. Tensordot (t, I, Achsen = ([0], [0])) 10 Schleifen, best of 3: 65,9 ms pro Schleife " – egpbos