Pregunta

Tengo una matriz numpy 2D. ¿Hay una manera de crear una vista en él, que incluiría las primeras filas k y todas las columnas?

El punto es evitar la copia de los datos subyacentes (la matriz es tan grande que la realización de copias parciales no es factible.)

¿Fue útil?

Solución

Claro, sólo indexará como lo haría normalmente. P.ej. y = x[:k, :] Esto devolverá una vista en la matriz original. No se copiará los datos y las actualizaciones hechas a y se reflejará en x y viceversa.


Editar:

Me comúnmente trabajo con> 10 GB matrices 3D de uint8 de, por lo que me preocupa mucho esto ... Numpy puede ser muy eficiente en la gestión de memoria si se mantiene un par de cosas en mente. Aquí hay algunos consejos sobre cómo evitar la realización de copias de matrices en la memoria:

Uso +=, -=, *=, 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 modificarlo. (También, echar un vistazo a numexpr )

Si desea hacer una copia con x = x + 10, ser conscientes de que x = x + 10.0 hará que automáticamente x a ser de hasta-fundido a una matriz de punto flotante, si no lo estaba ya. Sin embargo, x += 10.0, donde x es una matriz de enteros, hará que el 10.0 estar abajo-fundido a un int de la misma precisión que la matriz, en su lugar.

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


Como una segunda edición, he aquí algunos consejos más sobre visitas vs. 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, el doble de la cantidad de memoria que está utilizando) el uso y = x.copy()

A menudo se escucha sobre "la indexación de lujo" de matrices numpy. Usando una lista (o número entero array) como un índice es "indexación de lujo". Puede ser muy útil, pero las copias de los datos.

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

A pesar de la indexación realmente loco como x[4:100:5, :-10:-1, None] es la indexación "normal" y devolverá un punto de vista, sin embargo, así que no tenga miedo de usar todo tipo de trucos de rebanado en grandes series.

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

Tenga cuidado con esto, sin embargo ... Es muy potente y útil, pero hay que entender cómo se almacenan los datos subyacentes en la memoria. Si usted tiene una serie de flotadores, y los ven como enteros, (o viceversa) numpy interpretarán el subyacente los bits de la matriz como enteros.

Por ejemplo, esto significa que 1.0 como un flotador de 64 bits en un sistema poco-endian será 4607182418800017408 cuando se ve como un int de 64 bits, y una serie de [ 0, 0, 0, 0, 0, 0, 240, 63] si visto como un uint8. Esto es muy agradable cuando se tiene que hacer de bits haciendo girar de algún tipo en grandes series, aunque ... Usted tiene el control de bajo nivel sobre cómo se interpreta el búfer de memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top