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