Voglio tagliare un array NumPy nxn. Voglio estrarre una selezione arbitraria di m righe e colonne di quell'array (cioè senza alcun modello nei numeri di righe / colonne), rendendolo un nuovo array mxm. Per questo esempio diciamo che l'array è 4x4 e voglio estrarre un array 2x2 da esso.
Ecco il nostro array:
from numpy import *
x = range(16)
x = reshape(x,(4,4))
print x
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
La linea e le colonne da rimuovere sono uguali. Il caso più semplice è quando voglio estrarre una submatrix 2x2 che è all'inizio o alla fine, cioè:
In [33]: x[0:2,0:2]
Out[33]:
array([[0, 1],
[4, 5]])
In [34]: x[2:,2:]
Out[34]:
array([[10, 11],
[14, 15]])
Ma cosa succede se devo rimuovere un'altra combinazione di righe / colonne? Cosa devo fare se devo rimuovere la prima e la terza riga / riga, estraendo così la sottotrix [[5,7],[13,15]]
? Può esserci qualsiasi composizione di righe / linee. Ho letto da qualche parte che ho solo bisogno di indicizzare il mio array usando array / elenchi di indici sia per righe che per colonne, ma ciò non sembra funzionare:
In [35]: x[[1,3],[1,3]]
Out[35]: array([ 5, 15])
Ho trovato un modo, che è:
In [61]: x[[1,3]][:,[1,3]]
Out[61]:
array([[ 5, 7],
[13, 15]])
Il primo problema è che è appena leggibile, anche se posso conviverci. Se qualcuno ha una soluzione migliore, mi piacerebbe sicuramente ascoltarla.
Un'altra cosa è che ho letto su un forum che indicizzare matrici con matrici costringe NumPy a fare una copia dell'array desiderato, quindi quando si tratta con matrici di grandi dimensioni questo potrebbe diventare un problema. Perché è così / come funziona questo meccanismo?