Numpy: Funky vstack

Criado em 22 jul. 2020  ·  7Comentários  ·  Fonte: numpy/numpy

De vstack docs:

Assinatura: hstack(tup)
Docstring:
Empilhe matrizes em sequência horizontalmente (coluna sábia).

Isso é equivalente à concatenação ao longo do segundo eixo, exceto para 1-D
matrizes onde se concatena ao longo do primeiro eixo.

Minha pergunta é por que a exceção ??
Já temos concatenate() .

Reproduzindo exemplo de código:

v = rand(5)
concatenate((v, v)).shape
(10,)

hstack((v, v)).shape
(10,)

stack((v, v), axis=1).shape
(5, 2)

vstack((v, v)).shape
(2, 5)

stack((v, v), axis=0).shape
(2, 5)

Faria muito mais sentido ter vstack = stack(axis=1) .

33 - Question

Todos 7 comentários

Não incentivamos hstack / vstack / dstack e, em vez disso, incentivamos especificamente np.stack . No entanto, a diferença é se você passar em uma matriz 2-D. Algumas das funções da pilha inserem novas dimensões (para certas encarnações), eu acho que hstack não.

Adicionar uma última frase afirmando que np.concatenate ou np.stack são a API preferida (normalmente) seria bom, mas não acho que temos aspirações reais em excluir as funções.

Minha pergunta é _por que a exceção _ ???

Só porque @seberg não respondeu diretamente a isso:

  • alguém há muito tempo achou que era uma boa ideia
  • agora é tarde demais para mudar sem quebrar todos

Matrizes 1D são geralmente tratadas como "horizontais" em numpy ao invés de "verticais". Por exemplo, ao transmitir um array (N, N) 2D com um array (N,) 1D, o array 1D é transmitido para (1, N) , não (N, 1) . hstack()/vstack()/dstack() não são construídos em torno de conceitos de eixos constantes (você pode usar stack() se quiser), mas conceitos de "horizontal / vertical / profundidade" que não mapeiam perfeitamente em eixos fixos para todas as dimensionalidades da matriz.

Tenho -1 na linguagem que desencoraja hstack()/vstack()/dstack() , por si só. Eu _ainda_ acho que eles são bons e úteis _por causa_ das exceções em sua semântica. Eles capturam conceitos que não são capturados de forma concisa por stack() .

Por exemplo, há uma necessidade comum de preceder ou acrescentar um valor escalar a uma matriz 1D. np.hstack([0.0, some_vector]) funciona muito bem para isso. np.stack([0.0, some_vector]) e np.concatenate([0.0, some_vector]) balk porque eles não têm a mesma dimensionalidade.

É verdade que essas ferramentas estão um pouco relacionadas ao trabalho em um determinado contexto, eu acho. Então, vamos fechar isso. Temos as ferramentas genéricas sem comportamento "funky", e as outras estão aí para ficar quando forem bons utilitários.

@rkern , então concatenate precisa de conserto, IMHO. Empilhar significa concatenar após adicionar um dim extra, o que não é respeitado aqui. Mas tudo bem ...

@seberg , parece que um aviso de descontinuação seria bem-vindo aqui. Uma matriz 1D não é horizontal nem vertical. E hstack volta para concatenate , esquecendo-se de adicionar uma dimensão extra. Isso realmente parece "funky". Mas se você não quiser discutir, bem ...

Todas as outras funções ?stack também adicionam escurecimento extra apenas quando o escurecimento é menor do que o necessário para fazer a operação agora. Neste caso, isso abrange apenas 0d.

@Atcold Estou aberto a sugestões para estimular os usuários a stack , mas provavelmente dentro dos limites de não assustá-los ativamente para evitar o uso dessas funções.

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