2011-10-13 11 views
22

Ho una matrice numpy 2D e ho un array di righe e colonne che dovrebbe essere impostato su un valore particolare. Consente di prendere in considerazione il seguente esempiocome modificare un array numpy 2D in posizioni specifiche senza un loop?

a = array([[1, 2, 3], 
      [4, 5, 6], 
      [7, 8, 9]]) 

voglio modificare le voci a filari [0,2] e colonne [1,2]. Ciò dovrebbe comportare la seguente matrice

a = array([[1, 2, 0], 
      [4, 5, 0], 
      [7, 8, 9]]) 

ho seguito e portato a modificare ogni sequenza di colonna in ogni riga

rows = [0,1] 
cols = [2,2] 
b=a[numpy.ix_(rows,columns)] 

Essa ha portato alla seguente matrice modificando ogni colonna della matrice specificato

array([[1, 0, 0], 
     [4, 5, 6], 
     [7, 0, 0]]) 

Qualcuno potrebbe per favore fatemi sapere come farlo?

Grazie mille

EDIT: E 'da notare che le righe e le colonne coincidently successo a essere Sequentia. Il punto attuale è che questi potrebbero essere arbitrari e in qualsiasi ordine. se è rows = [a, b, c] e cols = [n x z] allora voglio modificare esattamente tre elementi nelle posizioni (a, n), (b, x), (c, z).

risposta

16

Aggiungendo a ciò che altri hanno detto, è possibile modificare questi elementi utilizzando l'indicizzazione di fantasia come segue:

In [39]: rows = [0,1] 

In [40]: cols = [2,2] 

In [41]: a = np.arange(1,10).reshape((3,3)) 

In [42]: a[rows,cols] = 0 

In [43]: a 
Out[43]: 
array([[1, 2, 0], 
     [4, 5, 0], 
     [7, 8, 9]]) 

si potrebbe desiderare di leggere la documentazione sulla indicizzazione array multidimensionali: http://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi-dimensional-arrays

Il punto chiave è:

se gli array di indice hanno una forma corrispondente e vi è un array di indice per ciascuna dim ension della matrice che viene indicizzata, la matrice risultante ha la stessa forma degli array di indici e i valori corrispondono al set di indici per ogni posizione negli array di indici.

È importante sottolineare che questo consente anche di fare le cose come:

In [60]: a[rows,cols] = np.array([33,77]) 

In [61]: a 
Out[61]: 
array([[ 1, 2, 33], 
     [ 4, 5, 77], 
     [ 7, 8, 9]]) 

cui è possibile impostare ogni elemento in modo indipendente utilizzando un altro array, lista o tupla delle stesse dimensioni.

+0

Hai perfettamente ragione. Grazie per aver indicato la documentazione. Era un bug nel programma. Lo sapevo ma non potevo lavorare. La tua risposta è molto esplicativa. – Shan

+0

che cosa c'è nella sintassi [x] in corso? –

+0

@johnktejik Questo è solo l'output di una cella di esecuzione di un notebook ipython/jupyter. Pensalo come un prompt numerato sulla linea. – JoshAdel

2

Prima di tutto, la tua descrizione della matrice "corretta" non corrisponde alle colonne e le righe specificate ...

Per ottenere l'array "corretto", devi fare questo:

a[:2, 2] = 0 

Per modificare la seconda e la terza colonna della prima e della terza riga, (righe [0,2] e colonne [1,2]) devi fare quello che stai facendo ... (La tua descrizione di modifica righe [0,2] e colonne [1,2] è esattamente il risultato che ottieni, giusto?)

+1

Il punto è che non lo voglio sequenziale ... La colonna e la riga possono essere numeri arbitrari. – Shan

0

Dovrebbe essere un semplice s a [0,2] = 0 e a [1,2] = 0. Puoi anche fare un [0: 2,2] = 0. L'indicizzazione dell'intervallo basato su ":" in python è un intervallo semiaperto [0,2) che in realtà varia da 0 a 1 (il punto finale di 2 non è incluso).

1

un lavoro intorno: ndarray.flatten, np.put(), ndarray.reshape

provare ndarray.flatten(array), in questo modo si tratta di un un array debole che può essere manipolato con numpy.put(array,[indices],[values]). Quindi utilizzare ndarray.reshape() per raggiungere le dimensioni originali.

Problemi correlati