<p>numpy.concat no parece funcionar en los ejes de transmisión (Trac # 1518)</p>

Creado en 19 oct. 2012  ·  11Comentarios  ·  Fuente: numpy/numpy

_Billete original http://projects.scipy.org/numpy/ticket/1518 el 22-06-2010 por el usuario de trac eob, asignado a desconocido

Cuando intento concatenar dos tensores juntos, la operación de concatenar no me permite usar dimensiones de transmisión (usando newaxis) en uno de ellos.

00 - Bug Other

Comentario más útil

Encontré una solución que me parece sólida ... simplemente use broadcast_arrays en la forma np.concatenate(np.broadcast_arrays(*arrays), axis=...) . Ej .: 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]])

Todos 11 comentarios

_trac user eob escribió el 2010-06-22_

Nota: la solución alternativa que estamos usando es colocar en mosaico el numpy.array en el que queríamos usar newaxis, lo que funciona pero a expensas de la memoria.

_ @ pv escribió el 2010-06-24_

¿Puede escribir un código de ejemplo autónomo que muestre lo que está tratando de hacer, lo que le gustaría que sucediera y lo que realmente sucede?

A partir de su descripción, no me queda del todo claro cómo le gustaría que funcionaran las cosas.

_ @ pv escribió el 2010-06-24_

Si te refieres a esto,

>>> 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]])

puedes hacerlo sin copias:

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

Pero sí, supongo que np.concatenate debería hacer esto automáticamente.

¿Alguna noticia / progreso en la transmisión de apoyo de np.concatenate ?

Ha habido algunas discusiones sobre esto en la lista en el pasado, y la sabiduría colectiva dictaba que era más probable que la transmisión en una operación concatenada enmascara errores no intencionales que una funcionalidad útil. Probablemente deberíamos cerrar esto.

En cualquier caso, si desea reactivar esa conversación nuevamente, el lugar correcto sería la lista de correo, no aquí.

¿Debería cerrarse esto porque "no se solucionará"?

Convenido. Tenga en cuenta que la transmisión manual ahora es un poco más fácil porque tenemos broadcast_to.

Solo necesitaba un poquito de refuerzo positivo, está cerrado. Si alguien tiene una opinión firme en contra de esto, no dude en reabrir.

Encontré una solución que me parece sólida ... simplemente use broadcast_arrays en la forma np.concatenate(np.broadcast_arrays(*arrays), axis=...) . Ej .: 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 Creo que hay un problema con esta solución (y con la transmisión manual en general como lo sugirieron otros en este hilo). No creo que tenga sentido transmitir en la dimensión en la que concatenamos. En otras palabras, en su caso, solo esperaría terminar con una columna de ceros.

Si alguien más también encuentra este problema, mientras buscaba una solución de transmisión en concatenación, publiqué mi solución en https://stackoverflow.com/questions/56357047/concatenate-with-broadcast/61061019#61061019

¿Fue útil esta página
0 / 5 - 0 calificaciones