2014-10-26 21 views
11

Supponiamo di avere una matrice NumPy 2D A:Splitting un array NumPy in due matrici

>>> import numpy as np 
>>> A=np.arange(30).reshape(3,10) 
>>> A 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]]) 

devo ottenere due matrici B e C con le seguenti proprietà:

B = array([[ 0, 3, 4, 5, 6, 7, 8, 9], 
      [10, 13, 14, 15, 16, 17, 18, 19], 
      [20, 23, 24, 25, 26, 27, 28, 29]]) 

C = array([[ 1, 2], 
      [11, 12], 
      [21, 22]]) 

Qual è la modo più semplice per realizzare questo?

Nota che devo ottenere tutti i set di C (2 colonne adiacenti) e B (che è A senza C). Ho provato diversi costrutti NumPy come np.delete, np.hstack ma nulla sembra funzionare nelle condizioni dell'angolo come nell'esempio precedente.

risposta

10

Uno dei modi più semplici è quello di utilizzare l'indicizzazione per selezionare le colonne appropriate:

>>> A[:, [1, 2]] # choose all rows from columns 1-2 (gives C) 
array([[ 1, 2], 
     [11, 12], 
     [21, 22]]) 

>>> A[:, np.r_[0, 3:10]] # choose all rows from columns 0, 3-9 (gives B) 
array([[ 0, 3, 4, 5, 6, 7, 8, 9], 
     [10, 13, 14, 15, 16, 17, 18, 19], 
     [20, 23, 24, 25, 26, 27, 28, 29]]) 

In alternativa, si potrebbe provare hsplit rottura A e poi concatenare i bit di nuovo insieme. Ciò tuttavia risulta meno efficiente rispetto al metodo di indicizzazione sopra riportato:

>>> splits = np.hsplit(A, [1, 3]) 
>>> B = np.hstack((splits[0], splits[2])) 
>>> C = splits[1] 
4

È possibile utilizzare array di fantasia indicizzazione:

B = A[:, [0] + list(range(3, A.shape[1]))] 
C = A[:, [1, 2]] 

dove:

  • la virgola separa gli indici che si desidera prendere da ogni dimensione.
  • operatore : dice di prendere tutti gli elementi di quella dimensione
  • usando una sequenza di numeri interi sarà specificare quali elementi della dimensione corrispondente dovrebbero essere prese (ex. [1, 2])
3

Per C è possibile utilizzare semplici affettare :

>>> A[:,1:3] 
array([[ 1, 2], 
     [11, 12], 
     [21, 22]]) 

Per B uso numpy.hstack su due fette di A:

>>> np.hstack((A[:,:1], A[:,3:])) 
array([[ 0, 3, 4, 5, 6, 7, 8, 9], 
     [10, 13, 14, 15, 16, 17, 18, 19], 
     [20, 23, 24, 25, 26, 27, 28, 29]]) 
>>> 
Problemi correlati