2016-06-28 8 views
0

Ich habe eine nd Array erstellt aus einer Datei wie:Dimension nicht für eine nd Array passende

for i in range(int(atoms)): 
    next(finp) 
    for j in range(int(ldata[2])): 
     aatom[i][j] = [float(x) for x in 
         finp.readline().strip().split()] 

Welche ich erwarte einen 3D-Array zu sein (i,j,x). Aber es ist nicht. Nachdem es zu einem Array numpy Umwandlung als:

atom = np.array(aatom) 
print(atom.shape) 

yeilds: (250, 301), die die Dimension der i,j ist. Aber in meinem denken Prozess wird es in der Tat 3d als:

print(atom[1][1][:]) 

yeilds: [-3.995, 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]

Was ich hier falsch mache?

+1

Meine Vermutung ist, die Listen in jeder 'aatom' Zelle haben unterschiedliche Längen und NumPy erzeugt eine' object' Anordnung (ein Array von 'list's anstelle von 'float's). Kannst du etwas vom rohen 'aatom'-Array und' atom.dtype' anzeigen? Außerdem sollten Sie 'atom [0, 0,:]' 'anstelle von 'atom [0] [0] [:]' verwenden. –

+0

Schauen Sie sich die Methode numpy.loadtxt an. Es liest Daten aus einer Textdatei in ein 2D-Array. Sie können das Ergebnis wahrscheinlich in das gewünschte 3D-Array umformen. – Rob

+0

Hallo Nils, deine Vermutung ist absolut richtig. Korrigiert es. Vielen Dank. – BaRud

Antwort

1

Ihre verschachtelten Listen haben wahrscheinlich unterschiedliche Längen, wodurch NumPy gezwungen ist, ein Array von dtype=object zu erstellen, was ein Array von list s anstelle von float s bedeutet.

vergleichen

a = [range(3), range(2)] # different lenghts in inner lists 
aa = np.array(a) 
print aa 
print aa.shape   # (2,) 
print aa.dtype   # dtype('O') 

und

b = [range(3), range(3)] # equal lenghts in inner lists 
bb = np.array(b) 
print bb 
print bb.shape   # (2, 3) 
print bb.dtype   # dtype('int64')