2010-11-19 25 views
19

sto lavorando in Python e ho una serie NumPy come questo:Ridimensionamento e si estende una matrice NumPy

[1,5,9] 
[2,7,3] 
[8,4,6] 

Come posso allungare a qualcosa di simile al seguente?

[1,1,5,5,9,9] 
[1,1,5,5,9,9] 
[2,2,7,7,3,3] 
[2,2,7,7,3,3] 
[8,8,4,4,6,6] 
[8,8,4,4,6,6] 

Questi sono solo alcuni array esempio, verrà effettivamente il ridimensionamento diversi formati di array, non solo questi.

Sono nuovo in questo, e non riesco proprio a spiegarmi cosa devo fare.

risposta

21

@ risposta di KennyTM è molto liscia, e funziona davvero per il vostro caso, ma come un'alternativa che potrebbe offrire un po 'più di flessibilità per l'espansione array cercano np.repeat:

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

>>> np.repeat(a,2, axis=1) 
array([[1, 1, 5, 5, 9, 9], 
     [2, 2, 7, 7, 3, 3], 
     [8, 8, 4, 4, 6, 6]]) 

Quindi, questo compie ripetendo insieme un asse, per ottenere lungo più assi (come si potrebbe desiderare), semplicemente il nido np.repeat chiamate:

>>> np.repeat(np.repeat(a,2, axis=0), 2, axis=1) 
array([[1, 1, 5, 5, 9, 9], 
     [1, 1, 5, 5, 9, 9], 
     [2, 2, 7, 7, 3, 3], 
     [2, 2, 7, 7, 3, 3], 
     [8, 8, 4, 4, 6, 6], 
     [8, 8, 4, 4, 6, 6]]) 

è anche possibile variare il numero di ripetizioni fo r qualsiasi riga o colonna iniziale. Ad esempio, se si voleva due ripetizioni di ogni riga a parte l'ultima riga:

>>> np.repeat(a, [2,2,1], axis=0) 
array([[1, 5, 9], 
     [1, 5, 9], 
     [2, 7, 3], 
     [2, 7, 3], 
     [8, 4, 6]]) 

Qui quando il secondo argomento è un list specifica una riga-saggio (righe in questo caso perché axis=0) si ripete per ogni riga .

+0

https: //docs.scipy. org/doc/NumPy/riferimento/generata/numpy.repeat.html –

12
>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]]) 
>>> numpy.kron(a, [[1,1],[1,1]]) 
array([[1, 1, 5, 5, 9, 9], 
     [1, 1, 5, 5, 9, 9], 
     [2, 2, 7, 7, 3, 3], 
     [2, 2, 7, 7, 3, 3], 
     [8, 8, 4, 4, 6, 6], 
     [8, 8, 4, 4, 6, 6]]) 
+2

Nel caso in cui qualcuno sta chiedendo, è il prodotto di Kronecker: http: //docs.scipy. org/doc/numpy/reference/generated/numpy.kron.html – krawyoti

+0

per quanto questa risposta sia fredda, ci vuole il doppio del metodo di ripetizione nella risposta di dtlussier sulla mia macchina per i big array –

1

Purtroppo numpy non consente passaggi frazionari (per quanto ne so). Ecco una soluzione. Non è così intelligente come soluzione di Kenny, ma si avvale di indicizzazione tradizionale:

>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]]) 
>>> step = .5 
>>> xstop, ystop = a.shape 
>>> x = numpy.arange(0,xstop,step).astype(int) 
>>> y = numpy.arange(0,ystop,step).astype(int) 
>>> mg = numpy.meshgrid(x,y) 
>>> b = a[mg].T 
>>> b 
array([[1, 1, 5, 5, 9, 9], 
     [1, 1, 5, 5, 9, 9], 
     [2, 2, 7, 7, 3, 3], 
     [2, 2, 7, 7, 3, 3], 
     [8, 8, 4, 4, 6, 6], 
     [8, 8, 4, 4, 6, 6]]) 

(soluzione dtlussier è meglio)

Problemi correlati