Ver en una matriz numpy?

Tengo una matriz numpy 2D. ¿Hay una manera de crear una vista en ella que incluya las primeras k filas y todas las columnas?

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

Claro, solo indícalo como lo harías normalmente. Por ejemplo, y = x[:k, :] Esto devolverá una vista a la matriz original. No se copiarán datos, y las actualizaciones realizadas en y se reflejarán en x y viceversa.


Editar:

Normalmente trabajo con arrays 3D de 10GB de uint8, así que me preocupo mucho por esto … Numpy puede ser muy eficiente en la administración de memoria si tienes algunas cosas en mente. Aquí hay algunos consejos para evitar hacer copias de arreglos en la memoria:

Utilice += , -= , *= , etc. para evitar hacer una copia de la matriz. Por ejemplo, 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 numexpr )

Si desea hacer una copia con x = x + 10 , tenga en cuenta que x = x + 10.0 causará que x convierta automáticamente en una matriz de punto flotante, si es que no lo estaba ya. Sin embargo, x += 10.0 , donde x es una matriz de enteros, hará que el 10.0 se convierta en un int de la misma precisión que la matriz.

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


Como segunda edición, aquí hay algunos consejos más sobre vistas frente a 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 oirás acerca de la “indexación sofisticada” de matrices numpy. El uso de una lista (o matriz de enteros) como un índice es “indexación elegante”. Puede ser muy útil, pero copia los datos.

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

Incluso la indexación realmente loca como x[4:100:5, :-10:-1, None] es una indexación “normal” y, sin embargo, devolverá una vista, así que no tengas miedo de usar todo tipo de trucos de rebanado a lo grande matrices

x.astype() devolverá una copia de los datos como el nuevo tipo, mientras que x.view() 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 flotadores, y los ve como ints, (o viceversa) numpy interpretará los bits subyacentes 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 4607182418800017408 como un int de 64 bits, y una matriz de [ 0, 0, 0, 0, 0, 0, 240, 63] si se visualiza como un uint8. Esto es realmente bueno cuando necesitas hacer giros de bits de algún tipo en arreglos grandes, aunque … Tienes un bajo nivel de control sobre cómo se interpreta el búfer de memoria.