<p>numpy.concat scheint nicht über Broadcast-Achsen hinweg zu funktionieren (Trac # 1518)</p>

Erstellt am 19. Okt. 2012  ·  11Kommentare  ·  Quelle: numpy/numpy

_Original Ticket http://projects.scipy.org/numpy/ticket/1518 am 22.06.2010 vom Trac-Benutzer eob, zugewiesen an unknown._

Wenn ich versuche, zwei Tensoren miteinander zu verketten, kann ich bei der Verkettungsoperation keine Broadcast-Dimensionen (unter Verwendung der neuen Achse) in einem von ihnen verwenden.

00 - Bug Other

Hilfreichster Kommentar

Ich habe eine Lösung gefunden, die mir solide erscheint ... benutze einfach Broadcast_arrays in der Form np.concatenate(np.broadcast_arrays(*arrays), axis=...) . Beispiel: np.concatenate(np.broadcast_arrays(0, [1, 2], [[3, 4], [5, 6]]), axis=1)array([[0, 0, 1, 2, 3, 4], [0, 0, 1, 2, 5, 6]])

Alle 11 Kommentare

_trac user eob schrieb am 22.06.2010_

Hinweis: Die Problemumgehung, die wir verwenden, besteht darin, das numpy.array zu kacheln, für das wir newaxis verwenden wollten. Dies funktioniert jedoch auf Kosten des Speichers.

_ @ pv schrieb am 24.06.2010_

Können Sie einen in sich geschlossenen Beispielcode schreiben, der zeigt, was Sie versuchen, was Sie gerne tun würden und was tatsächlich passiert?

Aus Ihrer Beschreibung geht mir nicht ganz klar hervor, wie die Dinge funktionieren sollen.

_ @ pv schrieb am 24.06.2010_

Wenn du das meinst,

>>> x = np.array([1,2,3,4])
>>> y = np.array([[1,2],[3,4],[5,6],[7,8]])
>>> np.concatenate((y, np.tile(x, (4,1))), axis=1)
array([[1, 2, 1, 2, 3, 4],
       [3, 4, 1, 2, 3, 4],
       [5, 6, 1, 2, 3, 4],
       [7, 8, 1, 2, 3, 4]])

Sie können es ohne Kopien tun:

def broadcast_view(x, ref):
    """Broadcast unit dimensions in `x` to match those in `ref` without copies"""
    strides = [0 if x.shape[j] == 1 else x.strides[j] for j in range(x.ndim)]
    shape = [ref.shape[j] if x.shape[j] == 1 else x.shape[j] for j in range(x.ndim)]
    from numpy.lib.stride_tricks import as_strided
    return as_strided(x, shape=shape, strides=strides)

>>> x = np.array([1,2,3,4])
>>> y = np.array([[1,2],[3,4],[5,6],[7,8]])
>>> np.concatenate((y, broadcast_view(x[None,:], y)), axis=1)
array([[1, 2, 1, 2, 3, 4],
       [3, 4, 1, 2, 3, 4],
       [5, 6, 1, 2, 3, 4],
       [7, 8, 1, 2, 3, 4]])
>>> broadcast_view(x[None,:], y).base.base.base is x
True

Aber ja, ich denke, np.concatenate sollte dies automatisch tun.

Gibt es Neuigkeiten / Fortschritte bei np.concatenate die den Rundfunk unterstützen?

In der Vergangenheit gab es einige Diskussionen darüber auf der Liste, und die kollektive Weisheit diktierte, dass das Senden in einem verketteten Vorgang eher unbeabsichtigte Fehler maskiert als eine nützliche Funktionalität. Wir sollten das wahrscheinlich schließen.

In jedem Fall wäre der richtige Ort die Mailingliste, nicht hier, wenn Sie dieses Gespräch noch einmal anregen möchten.

Sollte dies geschlossen werden, um "nicht zu beheben"?

Einverstanden. Beachten Sie, dass die manuelle Übertragung jetzt etwas einfacher ist, da wir Broadcast_to haben.

Ich brauchte nur ein kleines bisschen positive Verstärkung, geschlossen ist es. Wenn jemand eine starke Meinung dagegen hat, können Sie diese gerne wieder öffnen.

Ich habe eine Lösung gefunden, die mir solide erscheint ... benutze einfach Broadcast_arrays in der Form np.concatenate(np.broadcast_arrays(*arrays), axis=...) . Beispiel: np.concatenate(np.broadcast_arrays(0, [1, 2], [[3, 4], [5, 6]]), axis=1)array([[0, 0, 1, 2, 3, 4], [0, 0, 1, 2, 5, 6]])

@davidmashburn Ich denke, es gibt ein Problem mit dieser Lösung (und mit der manuellen Übertragung im Allgemeinen, wie von anderen in diesem Thread vorgeschlagen). Ich halte es nicht für sinnvoll, in der Dimension zu senden, in der wir verketten. Mit anderen Worten, in Ihrem Fall würde ich nur eine Spalte mit Nullen erwarten.

Wenn dieses Problem auch von einer anderen Person gefunden wird, habe ich bei der Suche nach einer Lösung für die Übertragung in Verkettung meine Lösung unter https://stackoverflow.com/questions/56357047/concatenate-with-broadcast/61061019#61061019 veröffentlicht

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen