2016-06-30 12 views
2

Ich habe zwei ndarrays:Multiply NumPy ndarray mit jedem Element in einem anderen binären ndarray unterschiedlicher Größe

a = [[30,40], 
    [60,90]] 

b = [[0,0,1], 
    [1,0,1], 
    [1,1,1]] 

beachten Sie bitte, dass eine Form könnte größer sein, aber immer quadratische Anordnung (50,50), (100,100) das gewünschte Ergebnis ist:

Result = [[a*0,a*0,a*1], 
     [[a*1,a*0,a*1], 
     [[a*1,a*1,a*1]] 

ich die richtige Antwort mit diesem Code bekommen verwaltet, aber ich denke, es wäre eine Funktion in numpy gebaut sein, die diese Aufgabe in schnellen Art und Weise erreichen

totalrows=[] 
    for row in range(b.shape[0]): 
     cells=[] 

     for column in range(b.shape[1]): 
      print row,column 
      cells.append(b[row,column]*a) 
     totalrows.append(np.concatenate(cells,axis=1)) 
    return np.concatenate(totalrows,axis=0) 

Antwort

2

In der Tat gibt es ein NumPy eingebautes np.kron für solche Block-basierte elementweise Multiplikationsprobleme. Um Ihren Fall zu lösen, könnte es wie so verwendet werden -

np.kron(b,a) 

Probelauf -

In [50]: a 
Out[50]: 
array([[30, 40], 
     [60, 90]]) 

In [51]: b 
Out[51]: 
array([[0, 0, 1], 
     [1, 0, 1], 
     [1, 1, 1]]) 

In [52]: np.kron(b,a) 
Out[52]: 
array([[ 0, 0, 0, 0, 30, 40], 
     [ 0, 0, 0, 0, 60, 90], 
     [30, 40, 0, 0, 30, 40], 
     [60, 90, 0, 0, 60, 90], 
     [30, 40, 30, 40, 30, 40], 
     [60, 90, 60, 90, 60, 90]]) 

3D-Array Fall

Nun lassen Sie uns sagen, wir arbeiten mit a als 3D Array (m,n,p) und b als (q,r) und vorausgesetzt, Sie sind eine solche blockweise Multiplikation iterativ entlang der letzten Achse von a durchzuführen. Daher müssen die Formen entlang der ersten zwei Achsen an den zwei Eingängen multipliziert werden, um das Ausgangsarray zu erhalten. Um eine solche Ausgabe zu erzielen, müssen wir die Dimension b erweitern, indem wir eine Singleton-Dimension als letzte Achse einführen. Die endgültige Ausgabe hätte die Form (m*q,n*r,p*1). Die Umsetzung wäre einfach -

np.kron(b[...,None],a) 

Form check -

In [161]: a = np.random.randint(0,99,(4,5,2)) 
    ...: b = np.random.randint(0,99,(6,7)) 
    ...: 

In [162]: np.kron(b[...,None],a).shape 
Out[162]: (24, 35, 2) 
+0

ich die Funktion ausgeführt wird, mit mir. mit b.form = (4,3), a.form = (100,100,3) kron bekomme mir diese Form: (100,400,9) aber die gewünschte Ausgabeform: (400,300,3) – samer226047

+0

@ samer226047 Für Fügen Sie einfach eine Achse zu "b" hinzu und verwenden Sie 'kron':' np.kron (b [..., None], a) '. Hoffe, das klappt für dich! – Divakar

+0

Es funktioniert, vielen Dank :) – samer226047

Verwandte Themen