<p>numpy.concat não parece funcionar em eixos de transmissão (Trac # 1518)</p>

Criado em 19 out. 2012  Â·  11Comentários  Â·  Fonte: numpy/numpy

_Tíquete original http://projects.scipy.org/numpy/ticket/1518 em 22/06/2010 pelo usuário trac eob, atribuído a desconhecido._

Quando estou tentando concatenar dois tensores, a operação concatenar não me permite usar dimensões de broadcast (usando newaxis) em um deles.

00 - Bug Other

Comentários muito úteis

Eu encontrei uma solução que me parece sólida ... apenas use broadcast_arrays na forma 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]])

Todos 11 comentários

_trac usuário eob escreveu em 22/06/2010_

Observação: a solução alternativa que estamos usando é agrupar o numpy.array no qual queríamos usar newaxis, o que funciona, mas às custas de memória.

_ @ pv escreveu em 24/06/2010_

Você pode escrever um pedaço de código de exemplo autocontido mostrando o que você está tentando fazer, o que gostaria que acontecesse e o que realmente acontece.

Pela sua descrição, não está totalmente claro para mim como você gostaria que as coisas funcionassem.

_ @ pv escreveu em 24/06/2010_

Se você quer dizer isso,

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

você pode fazer isso sem cópias:

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

Mas sim, acho que np.concatenate deve fazer isso automaticamente.

Alguma notícia / progresso em np.concatenate apoiando a transmissão?

Houve algumas discussões sobre isso na lista no passado, e a sabedoria coletiva ditou que a transmissão em uma operação de concatenação provavelmente mascararia erros não intencionais do que uma funcionalidade útil. Provavelmente deveríamos fechar isso.

Em qualquer caso, se você quiser estimular essa conversa novamente, o lugar certo seria a lista de e-mails, não aqui.

Deve ser encerrado como um "não consertará"?

Acordado. Observe que a transmissão manual agora é um pouco mais fácil porque temos broadcast_to.

Eu só precisava de um pequeno reforço positivo, fechado está. Se alguém tiver uma opinião forte contra isso, fique à vontade para reabrir.

Eu encontrei uma solução que me parece sólida ... apenas use broadcast_arrays na forma 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 Acho que há um problema com esta solução (e com a transmissão manual em geral, conforme sugerido por outros neste tópico). Não acho que faça sentido transmitir na dimensão em que nos concatenamos. Em outras palavras, no seu caso, eu esperaria terminar apenas com uma coluna de zeros.

Se outra pessoa também encontrar esse problema, enquanto procurava uma solução de transmissão em concatenação, postei minha solução em https://stackoverflow.com/questions/56357047/concatenate-with-broadcast/61061019#61061019

Esta página foi útil?
0 / 5 - 0 avaliações