2010-01-31 16 views
6

Sé que usted puede fácilmente crear listas anidadas en Python como esto:¿Cómo crear listas anidadas en python?

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

Pero cómo crear una matriz de 3x3x3 de ceros?

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

o

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

no parece correcto. ¿No hay forma de crearlo simplemente pasando una lista de dimensiones a un método? Ej:

CreateArray([3,3,3]) 

Respuesta

9

En caso una matriz es en realidad lo que está buscando, considere el paquete numpy.

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

Esto le dará una matriz 3x3x3 de ceros:

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

También se beneficia de las características de la conveniencia de un módulo integrado para la computación científica.

+0

Esto no funciona. Debería ser numpy.zeros ((3, 3, 3)) –

+0

@Cytokine corregido –

+0

Hah, juro que la tupla estaba allí cuando lo escribí ...Gracias Jader! –

-3

Sólo nido de la sintaxis de la multiplicación:

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

Por lo tanto es fácil de expresar esta operación utilizando folds

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

O si se quiere evitar la replicación de referencia, por lo que la alteración de uno el artículo no afectará a ningún otro, en su lugar debe usar copias:

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

permite por favor mi edición –

+0

@Jader Dias: Amén – Dario

+0

ahora en el mapa !! –

1

NumPy aborda este 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'> 

Pero si desea utilizar las listas nativas de Python como una matriz de los siguientes métodos de ayuda puede llegar a ser muy útil:

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

Las comprensiones de listas son solo azúcares sintácticos para agregar expresividad a la inicialización de la lista; en su caso, no los usaría en absoluto, y buscaré un simple bucle anidado.

En un nivel completamente diferente: ¿cree que el n-dimensional array de NumPy podría ser una mejor opción?
Aunque puede usar listas para implementar matrices multidimensionales, creo que no son la mejor herramienta para ese objetivo.

0

o usar la función definida nido here, en combinación con repetición (0) del módulo itertools:

nest(itertools.repeat(0),[3,3,3]) 
Cuestiones relacionadas