<p>numpy.concat ne semble pas fonctionner sur les axes de diffusion (Trac # 1518)</p>

Créé le 19 oct. 2012  ·  11Commentaires  ·  Source: numpy/numpy

_Billet original http://projects.scipy.org/numpy/ticket/1518 le 22/06/2010 par l'utilisateur trac eob, attribué à unknown._

Lorsque j'essaie de concaténer deux tenseurs ensemble, l'opération de concaténation ne me permet pas d'utiliser des dimensions de diffusion (en utilisant newaxis) dans l'un d'entre eux.

00 - Bug Other

Commentaire le plus utile

J'ai trouvé une solution qui me semble solide ... il suffit d'utiliser broadcast_arrays sous la forme np.concatenate(np.broadcast_arrays(*arrays), axis=...) . Ex: 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]])

Tous les 11 commentaires

_trac user eob rédigé le 2010-06-22_

Remarque: la solution de contournement que nous utilisons consiste à mettre en mosaïque le numpy.array sur lequel nous voulions utiliser newaxis, ce qui fonctionne mais aux dépens de la mémoire.

_ @ pv rédigé le 2010-06-24_

Pouvez-vous écrire un exemple de code autonome montrant ce que vous essayez de faire, ce que vous aimeriez qu'il se passe et ce qui se passe réellement.

D'après votre description, je ne vois pas clairement comment vous aimeriez que les choses fonctionnent.

_ @ pv rédigé le 2010-06-24_

Si tu veux dire ça,

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

vous pouvez le faire sans copies:

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

Mais oui, je suppose que np.concatenate devrait le faire automatiquement.

Des nouvelles / progrès sur np.concatenate supportant la diffusion?

Il y a eu des discussions à ce sujet sur la liste dans le passé, et la sagesse collective a dicté que la diffusion dans une opération concaténée était plus susceptible de masquer des erreurs involontaires, qu'une fonctionnalité utile. Nous devrions probablement fermer cela.

Dans tous les cas, si vous souhaitez relancer cette conversation, le bon endroit serait la liste de diffusion, pas ici.

Cela devrait-il être fermé comme un "ne résoudra pas"?

D'accord. Notez que la diffusion manuelle est maintenant un peu plus facile car nous avons broadcast_to.

J'avais juste besoin d'un tout petit peu de renforcement positif, c'est fermé. Si quelqu'un a une opinion forte contre cela, n'hésitez pas à rouvrir.

J'ai trouvé une solution qui me semble solide ... il suffit d'utiliser broadcast_arrays sous la forme np.concatenate(np.broadcast_arrays(*arrays), axis=...) . Ex: 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 Je pense qu'il y a un problème avec cette solution (et avec la diffusion manuelle en général comme suggéré par d'autres dans ce fil). Je ne pense pas qu'il soit logique de diffuser dans la dimension dans laquelle nous concaténons. En d'autres termes, dans votre cas, je ne m'attendrais qu'à finir avec une colonne de zéros.

Si quelqu'un d'autre trouve également ce problème, tout en recherchant une solution de diffusion en concaténation, j'ai publié ma solution sur https://stackoverflow.com/questions/56357047/concatenate-with-broadcast/61061019#61061019

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

dmvianna picture dmvianna  ·  4Commentaires

Foadsf picture Foadsf  ·  3Commentaires

manuels picture manuels  ·  3Commentaires

toddrjen picture toddrjen  ·  4Commentaires

perezpaya picture perezpaya  ·  4Commentaires