¿Cómo creo una vista en una matriz NumPy?

3 minutos de lectura

avatar de usuario
NPE

tengo un 2d numpy formación. ¿Hay alguna forma de crear una vista sobre él que incluya la primera k filas y todas las columnas?

El punto es evitar copiar los datos subyacentes (la matriz es tan grande que no es factible hacer copias parciales).

avatar de usuario
jose kington

Claro, simplemente indícelo como lo haría normalmente. P.ej y = x[:k, :] Esto devolverá una vista a la matriz original. No se copiará ningún dato, y cualquier actualización realizada a y se reflejará en x y viceversa.


Editar:

Por lo general, trabajo con matrices 3D de uint8 de más de 10 GB, por lo que me preocupo mucho por esto… Numpy puede ser muy eficiente en la administración de memoria si tiene en cuenta algunas cosas. Aquí hay algunos consejos para evitar hacer copias de arreglos en la memoria:

Usar +=, -=, *=, etc. para evitar hacer una copia de la matriz. P.ej x += 10 modificará la matriz en su lugar, mientras que x = x + 10 hará una copia y la modificará. (También, echa un vistazo a exprnumero)

Si desea hacer una copia con x = x + 10sé consciente de x = x + 10.0 causará x para ser convertido automáticamente a una matriz de coma flotante, si aún no lo estaba. Sin embargo, x += 10.0dónde x es una matriz de enteros, hará que el 10.0 para ser reducido a un int de la misma precisión que la matriz, en su lugar.

Además, muchas funciones numpy toman un out parámetro, por lo que puede hacer cosas como np.abs(x, x) tomar el valor absoluto de x en su lugar.


Como segunda edición, aquí hay algunos consejos más sobre puntos de vista contra copias con matrices numpy:

A diferencia de las listas de Python, y = x[:] no devuelve una copia, devuelve una vista. Si desea una copia (que, por supuesto, duplicará la cantidad de memoria que está usando) use y = x.copy()

A menudo escuchará sobre la “indexación elegante” de matrices numpy. Usar una lista (o una matriz de enteros) como índice es una “indexación elegante”. Puede ser muy útil, pero copia los datos.

Como ejemplo de esto: y = x[[0, 1, 2], :] devuelve una copia, mientras que y = x[:3,:] devolvería una vista.

Incluso una indexación realmente loca como x[4:100:5, :-10:-1, None] es una indexación “normal” y devolverá una vista, así que no tenga miedo de usar todo tipo de trucos de corte en matrices grandes.

x.astype(<dtype>) devolverá una copia de los datos como el nuevo tipo, mientras quex.view(<dtype>) devolverá una vista.

Sin embargo, tenga cuidado con esto… Es extremadamente poderoso y útil, pero necesita comprender cómo se almacenan los datos subyacentes en la memoria. Si tiene una matriz de flotantes y los ve como enteros (o viceversa), numpy interpretará el subyacente pedacitos de la matriz como ints.

Por ejemplo, esto significa que 1.0 como un flotador de 64 bits en un sistema little-endian será 4607182418800017408 cuando se ve como un int de 64 bits, y una matriz de [ 0, 0, 0, 0, 0, 0, 240, 63] si se ve como un uint8. Sin embargo, esto es realmente bueno cuando necesita hacer algún tipo de cambio de bits en matrices grandes … Tiene un control de bajo nivel sobre cómo se interpreta el búfer de memoria.

  • Gracias por los consejos muy buenos! Estaba leyendo la guía del usuario de Numpy y confundido por qué x[np.array([1, 1, 3, 1])] += 1 modificado x. ¡Ahora lo tengo!

    – tnq177

    11 de julio de 2015 a las 4:20


  • buenos consejos! Tengo otra pregunta. ¿Cómo probar que numpy no activa una copia sino solo una vista? El id() de python parece incapaz de esto.

    – wuhaochi

    10 de marzo de 2017 a las 2:59

  • @wuhaochi Si b es una vista de adespués b.base is a estarán True. Una copia (de cualquier matriz) siempre tendrá arr_copy.base is None

    – Jürg Merlin Spaak

    7 de agosto de 2017 a las 13:16

  • Realmente aprecio los consejos: he trabajado con numpy durante varios años y, sin embargo, ¡algunos de estos eran completamente desconocidos para mí!

    – corvus

    16 de febrero de 2021 a las 1:42

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad