Vraag Maak een 3D-array met Python


Ik zou graag een 3D-array in Python (2.7) willen maken om dit als volgt te gebruiken:

distance[i][j][k]

En de grootte van de array moet de grootte hebben van een variabele die ik heb. (N * n * n)

Ik heb geprobeerd met behulp van:

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

maar dat leek niet te werken.

Om het even welke ideeën? Hartelijk bedankt!

EDIT: Ik kan alleen de doofunctiebibliotheken gebruiken en de methode van vermenigvuldigen (dwz [[0] * n] * n) werkt niet omdat ze aan dezelfde aanwijzer zijn gekoppeld en ik alle waarden als individueel moet hebben

EDIT2: al opgelost door het antwoord hieronder.


25
2018-05-19 19:41


oorsprong


antwoorden:


Gebruik a lijst begrip:

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

Je had een datastructuur kunnen maken met een verklaring die leek op degene die je probeerde, maar het zou bijwerkingen hebben gehad omdat de innerlijke lijsten per referentie zijn:

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

47
2018-05-19 19:57



numpy.arrays zijn speciaal ontworpen voor deze case:

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

zal je een reeks dimensies geven ijk, gevuld met nullen.

afhankelijk van waar je het voor nodig hebt, numpy misschien wel de juiste bibliotheek voor uw behoeften.


24
2018-05-19 19:47



De juiste manier zou zijn

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

(Wat u probeert te doen moet worden geschreven als (voor NxNxN)

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

maar dat is niet correct, zie @Adaman comment waarom).


6
2018-05-19 19:46



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
2018-03-09 13:23



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

Gebruik liever numpy.ndarray voor meerdimensionale matrices.


3
2018-03-01 11:26



Als je erop staat dat initialiseren als leeg is, heb je een extra set haakjes aan de binnenkant nodig ([[]] in plaats van [], omdat dit "een lijst met 1 lege lijst die gedupliceerd moet worden" is in plaats van "een lijst met niets te dupliceren "):

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

0
2018-05-19 19:49



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
2018-01-20 13:43