Cómo crear de manera confiable un array multidimensional y una vista unidimensional en numpy, para que el diseño de memoria sea contiguo?
Según la documentación de numpy.ravel
,
Devuelve un array contiguo y aplanado.
>
Se devuelve un array de 1-D que contiene los elementos de entrada. Se realizará una copia solo si es necesaria.
Por conveniencia y eficiencia en la indexación, me gustaría tener una vista unidimensional de un array bidimensional. Estoy usando ravel
para crear la vista, y hasta ahora todo bien.
Sin embargo, no me queda claro lo que significa “Se realizará una copia solo si es necesaria”. Si algún día se crea una copia mientras se ejecuta mi código, el código dejará de funcionar.
Sé que existe numpy.reshape
, pero su documentación indica lo siguiente:
No siempre es posible cambiar la forma de un array sin copiar los datos.
En cualquier caso, me gustaría que los datos fueran contiguos.
¿Cómo puedo crear de manera confiable un array bidimensional y una vista unidimensional sobre él? Me gustaría que los datos fueran contiguos en la memoria (para eficiencia). ¿Existen atributos para especificar al crear el array bidimensional que aseguren que éste sea contiguo y que ravel
no tenga que copiarlo?
Pregunta relacionada: ¿Cuál es la diferencia entre las funciones flatten y ravel en numpy?
davy.ai
Para crear una matriz bidimensional confiable y una vista unidimensional de la misma, se puede utilizar
numpy.ndarray
con el parámetroorder
establecido en'C'
para ordenar en estilo de fila principal (estilo C) o'F'
para ordenar en estilo de columna principal (estilo Fortran). Esto garantizará que los datos sean contiguos en la memoria y queravel
no necesite hacer una copia (a menos que la matriz ya sea no contigua).Por ejemplo, para crear una matriz bidimensional contigua y una vista de ella, se puede utilizar:
Tenga en cuenta que si la matriz original no es contigua, puede que se necesite hacer una copia. En este caso, se puede utilizar
numpy.ascontiguousarray
para garantizar que los datos sean contiguos antes de llamar aravel
.También tenga en cuenta que hay una diferencia entre
ravel
yflatten
.ravel
devuelve una vista de la matriz de entrada (si es posible), mientras queflatten
devuelve una copia.