es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una matriz bidimensional confiable y una vista unidimensional de la misma, se puede utilizar numpy.ndarray con el parámetro order 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 que ravel 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:

    import numpy as np
    
    # Crear una matriz bidimensional de forma (2, 3) con ordenamiento en estilo de fila principal
    x = np.ndarray(shape=(2, 3), dtype=float, order='C')
    # Crear una vista unidimensional de x
    y = x.ravel()
    
    # Acceder y modificar elementos de x o y
    x[0, 1] = 1.0
    print(y[1])  # imprime 1.0
    y[2] = 2.0
    print(x[0, 2])  # imprime 2.0
    

    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 a ravel.

    También tenga en cuenta que hay una diferencia entre ravel y flatten. ravel devuelve una vista de la matriz de entrada (si es posible), mientras que flatten devuelve una copia.

Comments are closed.