Digamos que tengo una matriz a
:
a = np.array([[1,2,3], [4,5,6]])
array([[1, 2, 3],
[4, 5, 6]])
Me gustaría convertirlo en una matriz 1D (es decir, un vector de columna):
b = np.reshape(a, (1,np.product(a.shape)))
pero esto vuelve
array([[1, 2, 3, 4, 5, 6]])
que no es lo mismo que:
array([1, 2, 3, 4, 5, 6])
Puedo tomar el primer elemento de esta matriz para convertirla manualmente en una matriz 1D:
b = np.reshape(a, (1,np.product(a.shape)))[0]
pero esto requiere que sepa cuántas dimensiones tiene la matriz original (y concatene [0] cuando se trabaja con dimensiones más altas)
¿Existe una forma independiente de las dimensiones de obtener un vector de columna / fila de un ndarray arbitrario?
ravel()
devuelve una vista, pero eso no siempre es cierto. Hay casos en los queravel()
devuelve una copia. </a.ravel()
parece ser alrededor de tres veces más rápido quea.reshape(-1)
.a.flatten()
es mucho más lento, ya que necesita hacer una copia.o simplemente:
fuente
b = a.reshape(-1)
para abreviar en el primer ejemplo.Una de las formas más simples es usar
flatten()
, como este ejemplo:Mi matriz fue así:
Después de usar
flatten()
:También es la solución de errores de este tipo:
fuente
Para obtener una lista de la matriz con diferentes tamaños, utilice lo siguiente:
Salida:
[1 2 3 4 5 6 7 8]
fuente
a
espaldab
?Quería ver un resultado de referencia de las funciones mencionadas en las respuestas, incluidas las de unutbu .
También quiero señalar que doc numpy recomienda usar
arr.reshape(-1)
en caso de que la vista sea preferible. (aunqueravel
es un poco más rápido en el siguiente resultado)Punto de referencia
Funciones:
np.ravel
: devuelve la vista, si es posiblenp.reshape(-1)
: devuelve la vista, si es posiblenp.flatten
: devuelve copianp.flat
: vuelvenumpy.flatiter
. Similar aiterable
versión numpy: '1.18.0'
Tiempos de ejecución en diferentes
ndarray
tamaños.Conclusión
Código usado
fuente
Aunque esto no está usando el formato de matriz np, (para perezoso modificar mi código) esto debería hacer lo que quieras ... Si realmente quieres un vector de columna, querrás transponer el resultado del vector. Todo depende de cómo planeas usar esto.
Entonces, si necesita transponer, puede hacer algo como esto:
fuente