Domanda

Ho un array di numpy 2D. C'è un modo per creare una vista su di esso che includerebbe le prime file k e tutte le colonne?

Il punto è di evitare di copiare i dati sottostanti (la matrice è così grande che eseguono copie parziali non è fattibile.)

È stato utile?

Soluzione

Certo, proprio indice di come si farebbe normalmente. Per esempio. y = x[:k, :] Ciò restituirà una vista nell'array originale. Nessun dato viene copiato, e gli aggiornamenti effettuati y si rifletterà nella x e viceversa.


Modifica:

I comunemente lavoro con> array 10GB 3D di uint8 di, quindi mi preoccupo per questo molto ... Numpy può essere molto efficiente gestione della memoria se si mantiene un paio di cose in mente. Ecco alcuni suggerimenti su come evitare eseguire copie degli array in memoria:

Usa +=, -=, *=, ecc per evitare di fare una copia della matrice. Per esempio. x += 10 modificherà l'array in posizione, mentre x = x + 10 farà una copia e modificarlo. (Anche, dare un'occhiata alla numexpr )

Se si vuole fare una copia con x = x + 10, essere consapevoli che x = x + 10.0 causerà x automaticamente essere up-casted a un array in virgola mobile, se non fosse già. Tuttavia, x += 10.0, dove x è un array intero, causerà la 10.0 essere giù fuso a un int della stessa precisione della matrice, invece.

Inoltre, molte funzioni NumPy prendere un parametro out, in modo da poter fare le cose come np.abs(x, x) a prendere il valore assoluto di x sul posto.


Come seconda modifica, ecco alcuni consigli di più su Visto vs. copie con gli array NumPy:

A differenza di liste di pitone, y = x[:] non restituisce una copia, restituisce una visione. Se si desidera una copia (che, ovviamente, raddoppiare la quantità di memoria che si sta utilizzando) uso y = x.copy()

Ti sente spesso parlare di "fantasia indicizzazione" degli array numpy. Uso di un elenco (o numero intero array) come indice è "fantasia indicizzazione". Può essere molto utile, ma copia i dati.

Come esempio di questo: y = x[[0, 1, 2], :] restituisce una copia, mentre y = x[:3,:] restituirebbe la vista.

Anche l'indicizzazione davvero pazzo come x[4:100:5, :-10:-1, None] è l'indicizzazione "normale" e tornerà la vista, però, quindi non abbiate paura di usare tutti i tipi di trucchi affettatrici su grandi array.

x.astype(<dtype>) restituirà una copia dei dati come il nuovo tipo, whilex.view(<dtype>) restituirà la vista.

Fare attenzione con questo, però ... E 'estremamente potente e utile, ma è necessario capire come i dati sottostanti è memorizzato nella memoria. Se si dispone di una matrice di carri, e di visualizzarli come int, (o viceversa) numpy interpreteranno sottostante bit della matrice come int.

Ad esempio, ciò significa che 1.0 come un galleggiante 64 bit su un sistema little endian sarà 4607182418800017408 considerato in int 64bit, e una serie di [ 0, 0, 0, 0, 0, 0, 240, 63] se è vista come un uint8. Questo è davvero bello quando hai bisogno di fare bit-giocherellando di qualche tipo su grandi array, però ... Hai il controllo a basso livello su come il buffer di memoria viene interpretato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top