2010-01-31 10 views
6

Je sais que vous pouvez créer des listes facilement imbriquées en python comme ceci:Comment créer des listes imbriquées en python?

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

Mais comment créer une matrice 3x3x3 de zéros?

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

ou

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

ne semble pas juste. Il n'y a aucun moyen de le créer juste en passant une liste de dimensions à une méthode? Ex:

CreateArray([3,3,3]) 

Répondre

9

En cas une matrice est réellement ce que vous recherchez, considérez le paquet numpy.

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

Cela vous donnera un tableau de 3x3x3 de zéros:

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

Vous bénéficiez également des caractéristiques de commodité d'un module intégré pour le calcul scientifique.

+0

Cela ne fonctionne pas. Il devrait être numpy.zeros ((3, 3, 3)) –

+0

@Cytokine corrigé –

+0

Hah, je jure que le tuple était là quand je l'ai tapé ...Merci Jader! –

-3

Juste imbriquer la syntaxe de multiplication:

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

Il est donc simple d'exprimer cette opération en utilisant folds

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

Ou si vous voulez éviter la réplication de référence, afin de modifier un l'article n'affectera pas les autres, vous devriez plutôt utiliser des copies:

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

s'il vous plaît permettre à mon modifier –

+0

@Jader Dias: Amen – Dario

+0

maintenant avec carte !! –

1

NumPy aborde ce problème

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

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

Mais si vous voulez utiliser les listes natives Python comme une matrice les méthodes d'assistance suivantes peut devenir pratique:

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

Les compréhensions de liste ne sont que du sucre syntaxique pour ajouter de l'expressivité à l'initialisation de la liste; dans votre cas, je ne les utiliserais pas du tout, et opterais pour une simple boucle imbriquée.

À un niveau complètement différent: pensez-vous que le n-dimensional array de NumPy pourrait être une meilleure approche?
Bien que vous puissiez utiliser des listes pour implémenter des matrices multidimensionnelles, je pense que ce n'est pas le meilleur outil pour atteindre cet objectif.

0

Ou utilisez la fonction nid définie here, combinée à répétition (0) à partir du module itertools:

nest(itertools.repeat(0),[3,3,3]) 
Questions connexes