/ / Erstellen Sie 3D-Array mit Python - Python, Arrays, Python-2.7, Multidimensional-Array

Erstellen Sie 3D-Array mit Python - Python, Arrays, Python-2.7, multidimensionales Array

Ich möchte ein 3D-Array in Python (2.7) erstellen, um es so zu verwenden:

distance[i][j][k]

Und die Größe des Arrays sollte die Größe einer Variablen haben, die ich habe. (n * n * n)

Ich habe versucht mit:

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

aber das schien nicht zu funktionieren.

Irgendwelche Ideen? Danke vielmals!

EDIT: Ich kann nur die Schwer-Bibliotheken verwenden, und die Methode der Multiplikation (dh [[0] * n] * n) wird nicht funktionieren, da sie mit demselben Zeiger verknüpft sind und ich alle Werte einzeln benötigen muss

EDIT2: Bereits gelöst durch Antwort unten.

Antworten:

47 für die Antwort № 1

Sie sollten ein verwenden Listenverständnis:

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

Sie hätten eine Datenstruktur mit einer Anweisung erzeugen können, die wie die von Ihnen ausprobierte aussah, aber es hätte Nebenwirkungen gehabt, da die inneren Listen Kopie-durch-Referenz sind:

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

24 für die Antwort № 2

numpy.arrays sind nur für diesen Fall konzipiert:

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

wird Ihnen eine Reihe von Dimensionen geben ijk, mit Nullen gefüllt.

je nachdem, wofür du es brauchst, numpig kann die richtige Bibliothek für Ihre Bedürfnisse sein.


6 für die Antwort № 3

Der richtige Weg wäre

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

(Was Sie versuchen zu tun, sollte wie geschrieben werden (für NxNxN)

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

aber das ist nicht korrekt, siehe @Adaman Kommentar warum).


3 für die Antwort № 4
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 für die Antwort № 5
"""
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

Bevorzugen Sie zu verwenden numpy.ndarray für mehrdimensionale Arrays.


0 für die Antwort № 6

Wenn Sie auf alles initialisieren alsleer, Sie benötigen einen zusätzlichen Satz von Klammern auf der Innenseite ([[]] anstelle von [], da dies "eine Liste ist, die eine leere Liste enthält, die dupliziert werden soll" im Gegensatz zu "eine Liste, die nichts zu duplizieren enthält"):

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

0 für die Antwort № 7
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