2010-01-31 29 views
6

So che è possibile creare liste nidificate facilmente in Python come questo:Come creare elenchi nidificati in python?

[[1,2],[3,4]] 

Ma come creare una matrice 3x3x3 di zeri?

[[[0] * 3 for i in range(0, 3)] for j in range (0,3)] 

o

[[[0]*3]*3]*3 

non mi sembra giusto. Non c'è modo di crearlo semplicemente passando un elenco di dimensioni ad un metodo? Es:

CreateArray([3,3,3]) 

risposta

9

Nel caso in cui una matrice è in realtà ciò che stai cercando, considera il pacchetto numpy.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros

Questo vi darà una matrice 3x3x3 di zeri:

numpy.zeros((3,3,3)) 

È inoltre beneficiare delle caratteristiche di comfort di un modulo integrato per il calcolo scientifico.

+0

Questo non funziona. Dovrebbe essere numpy.zeros ((3, 3, 3)) –

+0

@Cytokine corretto –

+0

Hah, giuro che la tupla era lì quando l'ho scritta ...Grazie Jader! –

-3

Proprio nido la sintassi moltiplicazione:

[[[0] * 3] * 3] * 3 

E 'quindi semplice per esprimere questa operazione utilizzando folds

def zeros(dimensions): 
    return reduce(lambda x, d: [x] * d, [0] + dimensions) 

Oppure, se si vuole evitare la replica di riferimento, in modo da alterare uno l'articolo non avrà effetto su nessun altro, dovresti invece usare le copie:

import copy 
def zeros(dimensions): 
    item = 0 
    for dimension in dimensions: 
     item = map(copy.copy, [item] * dimension) 
    return item 
+1

permetta prego la mia modifica –

+0

@Jader Dias: Amen – Dario

+0

ora usando la mappa !! –

1

NumPy risolve questo problema

http://www.scipy.org/Tentative_NumPy_Tutorial#head-d3f8e5fe9b903f3c3b2a5c0dfceb60d71602cf93

>>> a = array([2,3,4]) 
>>> a 
array([2, 3, 4]) 
>>> type(a) 
<type 'numpy.ndarray'> 

Ma se si desidera utilizzare gli elenchi native Python come matrice i seguenti metodi di supporto può diventare a portata di mano:

import copy 

def Create(dimensions, item): 
    for dimension in dimensions: 
     item = map(copy.copy, [item] * dimension) 
    return item 
def Get(matrix, position): 
    for index in position: 
     matrix = matrix[index] 
    return matrix 
def Set(matrix, position, value): 
    for index in position[:-1]: 
     matrix = matrix[index] 
    matrix[position[-1]] = value 
1

La comprensione delle liste è solo zucchero sintattico per aggiungere espressività all'elenco di inizializzazione; nel tuo caso, non li userei affatto e fare un semplice ciclo annidato.

Su un livello completamente diverso: pensi che il n-dimensional array di NumPy potrebbe essere un approccio migliore?
Sebbene sia possibile utilizzare elenchi per implementare matrici multidimensionali, penso che non siano lo strumento migliore per raggiungere questo obiettivo.

0

Oppure utilizzare la funzione di nido definita here, combinato con ripetizione (0) dal modulo itertools:

nest(itertools.repeat(0),[3,3,3]) 
Problemi correlati