2017-08-31 13 views
1

einen 3D-Array und einen 2D-Arrays,Multipliziert element über Endachse von zwei Arrays

a = np.arange(10*4*3).reshape((10,4,3)) 
b = np.arange(30).reshape((10,3)) 

Wie kann ich laufen elementweise Multiplikation über die Endachse der einzelnen, in c resultierenden wo c die Form hat .shape als a? I.e.

c[0] = a[0] * b[0] 
c[1] = a[1] * b[1] 
# ... 
c[i] = a[i] * b[i] 

Antwort

2

Ohne Summenreduktion beteiligt sind, eine einfache broadcasting wäre wirklich effizient sein, nachdem b zu 3D mit np.newaxis/None erstreckt -

a*b[:,None,:] # or simply a*b[:,None] 

Runtime Test -

In [531]: a = np.arange(10*4*3).reshape((10,4,3)) 
    ...: b = np.arange(30).reshape((10,3)) 
    ...: 

In [532]: %timeit np.einsum('ijk,ik->ijk', a, b) #@Brad Solomon's soln 
    ...: %timeit a*b[:,None] 
    ...: 
100000 loops, best of 3: 1.79 µs per loop 
1000000 loops, best of 3: 1.66 µs per loop 

In [525]: a = np.random.rand(100,100,100) 

In [526]: b = np.random.rand(100,100) 

In [527]: %timeit np.einsum('ijk,ik->ijk', a, b) 
    ...: %timeit a*b[:,None] 
    ...: 
1000 loops, best of 3: 1.53 ms per loop 
1000 loops, best of 3: 1.08 ms per loop 

In [528]: a = np.random.rand(400,400,400) 

In [529]: b = np.random.rand(400,400) 

In [530]: %timeit np.einsum('ijk,ik->ijk', a, b) 
    ...: %timeit a*b[:,None] 
    ...: 
10 loops, best of 3: 128 ms per loop 
10 loops, best of 3: 94.8 ms per loop 
+0

@BradSolomon Das ist richtig. Zeitpunkte hinzugefügt, um diese zu bestätigen. – Divakar

1

np.einsum Verwendung:

c = np.einsum('ijk,ik->ijk', a, b) 

Quick-Check:

print(np.allclose(c[0], a[0] * b[0])) 
print(np.allclose(c[1], a[1] * b[1])) 
print(np.allclose(c[-1], a[-1] * b[-1])) 
# True 
# True 
# True 
Verwandte Themen