2012-05-19 46 views
23

me gustaría crear una matriz 3D en Python (2.7) para utilizar como esto:Crear una matriz 3D usando Python

distance[i][j][k] 

y el tamaño de la matriz debe ser el tamaño de una variable que tengo. (N * n * n)

He intentado utilizar:

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

pero eso no parece funcionar.

¿Alguna idea? ¡Muchas gracias!

EDITAR: Solo puedo usar las bibliotecas de sordos, y el método de multiplicación (es decir [[0] * n] * n) no funcionará porque están vinculados al mismo puntero y necesito todos los valores para ser individuo

EDIT2: Ya se ha resuelto por respuesta a continuación.

+0

Considere utilizar la clase 'array' del módulo' array' estándar. – martineau

Respuesta

44

se debe utilizar un list comprehension:

>>> 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 

se podría haber producido una estructura de datos con una declaración que se parecía al que ha intentado, pero habría tenido efectos secundarios ya que las listas internas son copia por r eferencia:

>>> 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]]] 
+0

Gracias, esto parece funcionar bien. Voy a probar en mi programa y vuelvo pronto con los resultados. –

5

La forma correcta sería

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

(Lo que estamos tratando de hacer debe ser escrito como (por NxNxN)

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

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

+0

No es bueno. Contendrá referencias a la misma matriz. Pruebe esto: 'a = [[0] * 3] * 3; a [0] [0] = 1; print a' – Amadan

21

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

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

le dará una matriz de dimensiones i j k, llenado con ceros.

dependiendo de lo que lo necesite, numpy puede ser la biblioteca adecuada para sus necesidades.

+0

Gracias, intentaré esto –

+0

Oh, pensé que esta era una de las bibliotecas de sordos. No puedo usar nada más que eso. –

+1

no, desafortunadamente es una biblioteca externa. pero generalmente es muy adecuado si necesita procesar matrices (grandes) de datos numéricos. Especialmente si la velocidad es un problema. – mata

0

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

distance=[[[[]]*n]*n]*n 
+1

¡No hagas eso, o todos señalarán la misma referencia! Simplemente intente 'distance [1] [2] [0] .append (1)' –

+0

Sí, mi problema es que si cambio uno de ellos, también los cambiará a todos. Necesito que sean elementos separados. –

2
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]] 
+0

¡Gracias por la aclaración 'col',' row' y 'x'! – Gluttton

0
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 
3
""" 
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 

prefieren utilizar numpy.ndarray para las matrices multidimensionales.

Cuestiones relacionadas