web-dev-qa-db-fra.com

Créer un tableau 3D en utilisant Python

Je voudrais créer un tableau 3D dans Python (2.7) à utiliser comme ceci:

distance[i][j][k]

Et les tailles du tableau devraient être la taille d'une variable que j'ai. (n * n * n)

J'ai essayé d'utiliser:

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

mais cela n'a pas semblé fonctionner.

Des idées? Merci beaucoup!

EDIT: je ne peux utiliser que les bibliothèques de surduction, et la méthode de multiplication ([[0] * n] * n) ne fonctionnera pas car elles sont liées au même pointeur et que toutes les valeurs doivent être individuelles

EDIT2: Déjà résolu par la réponse ci-dessous.

33
Laís Minchillo

Vous devriez utiliser un compréhension de la liste :

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

Vous auriez pu produire une structure de données avec une instruction qui ressemblait à celle que vous avez essayée, mais cela aurait eu des effets secondaires puisque les listes internes sont copiées par référence:

>>> 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]]]
58
robert

numpy.arrays sont conçus uniquement pour ce cas:

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

vous donnera un tableau de dimensions i j k, rempli de zéros.

en fonction de vos besoins, numpy est peut-être la bonne bibliothèque pour vos besoins.

28
mata

La bonne façon serait

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

(Ce que vous essayez de faire devrait être écrit comme (pour NxNxN)

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

mais ce n’est pas correct, voir @Adaman comment).

7
hamstergene
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]]
3
albruno
"""
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

Préfère utiliser numpy.ndarray pour les tableaux multidimensionnels.

3
Naimish Agarwal

Si vous insistez pour que tout soit initialisé comme vide, vous avez besoin d'un jeu supplémentaire de crochets à l'intérieur ([[]] au lieu de [], puisqu'il s'agit "d'une liste contenant 1 liste vide à dupliquer" par opposition à "une liste contenant rien à dupliquer "):

distance=[[[[]]*n]*n]*n
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
0
zie1ony