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()
.
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)
.
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:
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.