numpy diferencia entre plano y ravel()

¿Cuál es la diferencia entre los siguientes?

>>> import numpy as np
>>> arr = np.array([[[  0,   1,   2],
...                  [ 10,  12,  13]],
...                 [[100, 101, 102],
...                  [110, 112, 113]]])
>>> arr
array([[[  0,   1,   2],
        [ 10,  12,  13]],
       [[100, 101, 102],
        [110, 112, 113]]])
>>> arr.ravel()
array([  0,   1,   2,  10,  12,  13, 100, 101, 102, 110, 112, 113])
>>> arr.ravel()[0] = -1
>>> arr
array([[[ -1,   1,   2],
        [ 10,  12,  13]],
       [[100, 101, 102],
        [110, 112, 113]]])
>>> list(arr.flat)
[-1, 1, 2, 10, 12, 13, 100, 101, 102, 110, 112, 113]
>>> arr.flat[0] = 99
>>> arr
array([[[ 99,   1,   2],
        [ 10,  12,  13]],
       [[100, 101, 102],
        [110, 112, 113]]])

Que el hecho de que flat devuelve un iterador en lugar de una lista, que parecen ser la misma, ya que tanto alterar la matriz original (esto es en contraste a flatten(), que devuelve una copia de la matriz). Así que, ¿hay alguna otra diferencia significativa entre flat y ravel()? Si no, cuando sería útil usar uno en lugar del otro?

  • np.array(arr.flat) da algo más cercano (tal vez idéntica) a np.ravel(x).
InformationsquelleAutor b_pcakes | 2016-07-13

1 Kommentar

  1. 10

    flat es un iterador. Es un objeto independiente que sólo pasa a dar acceso a los elementos de la matriz a través de la indexación. Su propósito principal es para ser utilizado en los bucles y la comprensión de las expresiones. El orden que se le da es el mismo que el que se suele obtener a partir de ravel.

    A diferencia del resultado de ravel, flat no es un ndarray, por lo que no se puede hacer mucho, además de la indexación de la matriz y de iterar sobre él. Aviso de que había que llamar a list para ver el contenido del iterador. Por ejemplo, arr.flat.min() fallaría con un AttributeError, mientras que arr.ravel().min() daría el mismo resultado que arr.min().

    Desde numpy que ofrece muchas de las operaciones que no requieren explícito de los bucles escrito, ndarray.flat, y los iteradores en general, rara vez se utilizan en comparación con ndarray.ravel().

    Que se dice, hay situaciones en las que un iterador es preferible. Si su matriz es lo suficientemente grande y están tratando de inspeccionar todos los elementos uno por uno, un iterador que iba a funcionar bien. Esto es especialmente cierto si usted tiene algo así como una memoria asignada a la matriz que se carga en porciones.

    • Específicamente flat produce un objeto de tipo np.flatiter (ver su google docs). También se implementa como un atributo de la matriz, no un método o función.
    • Técnicamente flat es una propiedad de ndarray, lo que significa que es básicamente un no-arg método de acceso como un atributo, pero realmente devolver una nueva instancia cada vez que se accede.
    • flat (a lo largo de atributos como shape) se definen en numpy c código, y no realmente utilizan Python property mecanismo: numpy/core/src/multiarray/getset.c`. Funcionalmente son similares.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...