Crea una matriz 3D usando Python

Me gustaría crear una matriz 3D en Python (2.7) para usar así:

distance[i][j][k] 

Y los tamaños de la matriz deben ser el tamaño de una variable que tengo. (n * n * n)

Intenté usar:

 distance = [[[]*n]*n] 

pero eso no parece funcionar.

¿Algunas ideas? ¡Muchas gracias!

EDITAR: solo puedo usar las bibliotecas sordas y el método de multiplicación (es decir, [[0] * n] * n) no funciona porque están vinculados al mismo puntero y necesito que todos los valores sean individuales

EDIT2: Ya resuelto por respuesta abajo.

Debe utilizar una lista de comprensión :

 >>> import pprint >>> n = 3 >>> distance = [[[0 for k in xrange(n)] for j in xrange(n)] for i in xrange(n)] >>> pprint.pprint(distance) [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]] >>> distance[0][1] [0, 0, 0] >>> distance[0][1][2] 0 

Podría haber producido una estructura de datos con una statement que se parecía a la que probó, pero habría tenido efectos secundarios ya que las listas internas son copia por referencia:

 >>> distance=[[[0]*n]*n]*n >>> pprint.pprint(distance) [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]] >>> distance[0][0][0] = 1 >>> pprint.pprint(distance) [[[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]]] 

numpy.array s están diseñados solo para este caso:

  numpy.zeros((i,j,k)) 

le dará una serie de dimensiones i j k, llenas de ceros.

Dependiendo de para qué lo necesite, Numpy puede ser la biblioteca adecuada para sus necesidades.

El camino correcto sería

 [[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)] 

(Lo que estás tratando de hacer debería escribirse como (para NxNxN)

 [[[0]*n]*n]*n 

pero eso no es correcto, ver @Adaman comentar por qué).

 d3 = [[[0 for col in range(4)]for row in range(4)] for x in range(6)] d3[1][2][1] = 144 d3[4][3][0] = 3.12 for x in range(len(d3)): print d3[x] [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] [[0, 0, 0, 0], [0, 0, 0, 0], [0, 144, 0, 0], [0, 0, 0, 0]] [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [3.12, 0, 0, 0]] [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
 """ Create 3D array for given dimensions - (x, y, z) @author: Naimish Agarwal """ def three_d_array(value, *dim): """ Create 3D-array :param dim: a tuple of dimensions - (x, y, z) :param value: value with which 3D-array is to be filled :return: 3D-array """ return [[[value for _ in xrange(dim[2])] for _ in xrange(dim[1])] for _ in xrange(dim[0])] if __name__ == "__main__": array = three_d_array(False, *(2, 3, 1)) x = len(array) y = len(array[0]) z = len(array[0][0]) print x, y, z array[0][0][0] = True array[1][1][0] = True print array 

Prefiero usar numpy.ndarray para arreglos multidimensionales.

Si insiste en que todo se inicialice como vacío, necesita un conjunto adicional de corchetes en el interior ([[]] en lugar de [], ya que esta es “una lista que contiene 1 lista vacía que debe duplicarse” en lugar de “una lista que contiene nada para duplicar “):

 distance=[[[[]]*n]*n]*n 
 def n_arr(n, default=0, size=1): if n is 0: return default return [n_arr(n-1, default, size) for _ in range(size)] arr = n_arr(3, 42, 3) assert arr[2][2][2], 42