2013-04-23 17 views
5

Ich möchte zwei numpy Arrays unterschiedlicher Formen hinzufügen, aber ohne Broadcast werden eher die "fehlenden" Werte als Nullen behandelt. Wahrscheinlich am einfachsten mit einem Beispiel wieHinzufügen von numpy Arrays unterschiedlicher Formen

[1, 2, 3] + [2] -> [3, 2, 3] 

oder

[1, 2, 3] + [[2], [1]] -> [[3, 2, 3], [1, 0, 0]] 

Ich weiß nicht, die Formen im Voraus.

Ich bin mit der Ausgabe von np.shape für jeden zu tun, versuchen, die kleinste Form zu finden, die beide von ihnen, einbetten jedes in einem Null-ed-Array dieser Form und dann fügt sie. Aber es scheint ziemlich viel Arbeit, gibt es einen einfacheren Weg?

Vielen Dank im Voraus!

edit: von „viel Arbeit“ I „eine Menge Arbeit für mich“ zu verstehen, anstatt für die Maschine, ich suche Eleganz anstatt Effizienz: meine Bemühungen, die kleinste Form bekommen beide halten sie ist

def pad(a, b) : 
    sa, sb = map(np.shape, [a, b]) 
    N = np.max([len(sa),len(sb)]) 
    sap, sbp = map(lambda x : x + (1,)*(N-len(x)), [sa, sb]) 
    sp = np.amax(np.array([ tuple(sap), tuple(sbp) ]), 1) 

nicht recht: -/

Antwort

1

Dies ist das Beste, was ich könnte kommen mit:

import numpy as np 

def magic_add(*args): 
    n = max(a.ndim for a in args) 
    args = [a.reshape((n - a.ndim)*(1,) + a.shape) for a in args] 
    shape = np.max([a.shape for a in args], 0) 
    result = np.zeros(shape) 

    for a in args: 
     idx = tuple(slice(i) for i in a.shape) 
     result[idx] += a 
    return result 

Sie können die for-Schleife a aufräumen wenig, wenn Sie wissen, wie viele Dimensionen Sie erwarten, etwas wie:

for a in args: 
    i, j = a.shape 
    result[:i, :j] += a 
+0

Danke Bi, das ist ziemlich glatt – n00b

4

ich bin herum~~POS=TRUNC mit dem Ausgang des np.shape für jeden, die beide versuchen, die kleinste Form zu finden, von denen hält, die jeweils in einem Null-ed Anordnung zum Einbetten diese Form und dann fügen Sie sie hinzu. Aber es scheint ziemlich viel Arbeit, gibt es einen einfacheren Weg?

bekommen die np.shape ist trivial, das Finden der kleinsten Form, die beide hält, ist sehr einfach, und natürlich ist das Hinzufügen trivial, so dass die einzige „viel Arbeit“ Teil ist die „jeweils in einer Null-ed Einbettung Array dieser Form ".

Und ja, Sie können das beseitigen, indem Sie einfach die resize Methode (oder die resize Funktion, wenn Sie Kopien erstellen möchten, anstatt sie an Ort und Stelle zu ändern). Da die Dokumente zu erklären:

ein Array Erweiterung: ... fehlende Einträge werden mit Nullen gefüllt

Zum Beispiel, wenn Sie die Dimensionalität statisch wissen:

>>> a1 = np.array([[1, 2, 3], [4, 5, 6]]) 
>>> a2 = np.array([[2], [2]]) 
>>> shape = [max(a.shape[axis] for a in (a1, a2)) for axis in range(2)] 
>>> a1.resize(shape) 
>>> a2.resize(shape) 
>>> print(a1 + a2) 
array([[3, 4, 3], 
     [4, 5, 6]]) 
+0

Resize tut nicht das Richtige hier, versuchen Sie 'a2.resize (4, 4)'. Dies schlägt auch fehl, wenn die Eingänge unterschiedliche Werte haben. –