2012-03-31 15 views
5

Tengo un problema al inicializar una matriz 2D en python. Quiero una matriz 6x6, hiceInicializando matriz 2D en Python

arr = [[None]*6]*6 

Pero cuando lo haga:

>>> arr[1][2]=10 
>>> arr 
[[None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None]] 

Aviso Acabo de crear 1 artículo, y su "replicados" en todas las filas. ¿Qué pasa? Creo que tiene que ver con su referencia a la misma lista, pero ¿cómo puedo solucionar esto?

que pensé

for key, _ in algos.items(): 
    algoData[key] = [] 
    for i in range(0,6): 
     algoData[key].append([]) 
     for j in range(0,6): 
      algoData[key][i].append(None) 

obras, pero parece mucho a solo inicializar una matriz 6x6 vacío, lo que si quiero una matriz 10000x10000, será muy ineficiente?

ACTUALIZACIÓN

¿Puedo también inicializar un diccionario de matrices 2D? Tengo un diccionario como:

algos = { "FIFO": ..., "LRU": ..., "Random": ... } 

Quiero inicializar un diccionario, como a continuación:

algoData = { "FIFO": 2D arr, "LRU": 2D arr, "Random": 2D arr } 

Respuesta

14

El uso de listas por comprensión, se puede decir:

arr = [[None for x in range(6)] for y in range(6)] 

, entonces tendrá arr[1][2] = 10 de trabajo como se esperaba. Sin embargo, esto no es algo muy normal de hacer. ¿Para qué vas a usar las listas anidadas? Puede haber una mejor manera. Por ejemplo, trabajar con matrices se hace mucho más fácil con el paquete numpy.

+0

Quiero almacenar datos para usar con matplotlib (una trama de superficie 3D) –

+3

En ese caso, definitivamente recomendaría numpy. Se utiliza en [este ejemplo] (http://matplotlib.sourceforge.net/examples/animation/simple_3danim.html), si desea ver una muestra. Ahórrate el trabajo; es un gran paquete. – Cameron

+0

Entonces la línea que necesito será simplemente 'lineData = np.empty ((dims, length))'? –

15

@Cameron está en lo correcto al sugerir que use NumPy para manejar matrices de datos numéricos. Y para la segunda parte de su pregunta, ~ Niklas B. está de acuerdo con su sugerencia de usar defaultdict.

Lo que no se ha cubierto es por qué[[None]*6]*6 se comporta de forma extraña.

La respuesta es que [None]*6 crea una lista con seis None s en ella (como se espera), pero [list]*6 no hace seis copias independientes de list - que hace seis copias de una referencia a la mismalist .

Idiomatic Python tiene una sección que puede explicar esto mejor: "Other languages have variables - Python has names".