Numpy: Funky vstack

Creado en 22 jul. 2020  ·  7Comentarios  ·  Fuente: numpy/numpy

Desde vstack docs:

Firma: hstack(tup)
Docstring:
Apile las matrices en secuencia horizontalmente (en columnas).

Esto es equivalente a la concatenación a lo largo del segundo eje, excepto para 1-D
matrices donde se concatena a lo largo del primer eje.

Mi pregunta es ¿por qué la excepción ?
Ya tenemos concatenate() .

Ejemplo de código de reproducción:

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)

Tendría mucho más sentido tener vstack = stack(axis=1) .

33 - Question

Todos 7 comentarios

No recomendamos hstack / vstack / dstack, y en su lugar recomendamos específicamente np.stack . Sin embargo, la diferencia es si pasa una matriz 2-D. Algunas de las funciones de la pila insertan nuevas dimensiones (para ciertas encarnaciones), supongo que hstack no.

Agregar una última oración que indique que np.concatenate o np.stack son la API preferida (generalmente) estaría bien, pero no creo que tengamos aspiraciones reales al eliminar las funciones.

Mi pregunta es _¿por qué la excepción _ ???

Solo porque @seberg no respondió directamente a esto:

  • alguien pensó hace mucho tiempo que era una buena idea
  • ahora es demasiado tarde para cambiarlo sin romper a todos

Las matrices 1D generalmente se tratan como "horizontales" en número en lugar de "verticales". Por ejemplo, al difundir una matriz (N, N) 2D con una matriz (N,) 1D, la matriz 1D se transmite a (1, N) , no a (N, 1) . hstack()/vstack()/dstack() no se basan en conceptos de ejes constantes (puede usar stack() si lo desea) sino conceptos de "horizontal / vertical / profundidad" que no se asignan claramente a ejes fijos para todas las dimensionalidades de la matriz.

Soy -1 en el lenguaje que desalienta hstack()/vstack()/dstack() , per se. Todavía creo que son buenas y útiles debido a las excepciones en su semántica. Capturan conceptos que no son capturados de manera concisa por stack() .

Por ejemplo, existe una necesidad común de anteponer o agregar un valor escalar a una matriz 1D. np.hstack([0.0, some_vector]) funciona muy bien para esto. np.stack([0.0, some_vector]) y np.concatenate([0.0, some_vector]) resisten porque no tienen la misma dimensionalidad.

Es cierto, creo que estas herramientas están simplemente un poco relacionadas con trabajar en un contexto dado. Así que cerremos esto. Tenemos las herramientas genéricas sin comportamiento "funky", y las otras están ahí para quedarse cuando sean buenas utilidades.

@rkern , entonces concatenate necesita ser arreglado, en mi humilde opinión. Apilar significa concatenar después de agregar un dim extra, que no se respeta aquí. Pero está bien…

@seberg , parece que una advertencia de desaprobación sería bienvenida aquí. Una matriz 1D no es horizontal ni vertical. Y hstack vuelve a concatenate , olvidándose de agregar una dimensión adicional. De hecho, esto parece "funky". Pero si no estás dispuesto a discutir, bueno ...

Todas las demás funciones ?stack también agregan atenuaciones adicionales solo cuando las atenuaciones son más bajas que las necesarias para realizar la operación en este momento. En este caso, solo abarca 0d.

@Atcold Estoy abierto a sugerencias para empujar a los usuarios a stack , pero probablemente dentro de los límites de no asustarlos activamente para que no usen estas funciones.

¿Fue útil esta página
0 / 5 - 0 calificaciones