2017-07-03 6 views
3

Ich habe eine Matrix y mit der Größe (3,3). Angenommen, es ist eine 3 mal 3 Matrix mit allen Elementen = 1.Anfügen einer Matrix in Python innerhalb der Schleife

Ich habe dann eine Schleife, um mehrere (3,3) Matrizen zu erstellen. sind also diese die Ausgänge:

Erste Schleife ich diese Matrix erhalten:

[[ 88. 42.5 9. ] 
[ 121.5 76. 42.5] 
[ 167. 121.5 88. ]] 

Die zweite Schleife erhalte ich:

[[ 88. 42.5 13. ] 
[ 117.5 72. 42.5] 
[ 163. 117.5 88. ]] 

Also, was ich im Wesentlichen erreichen möchte, ist

[[1, 1, 1] [88, 42.5, 9] [88, 42.5, 13], 
[1, 1, 1] [121.5, 76, 42.5] [117.5, 72, 42.5], 
[1, 1, 1] [167, 121.5, 88] [163, 117.5, 88]] 

Dies ist davon ausgegangen, dass die Schleife zweimal iteriert, und ich bin mir nicht sicher, ob ich pl habe die Kommas oder den Abstand etc. an der richtigen Stelle, aber idealerweise bekomme ich eine 3 mal 3 Matrix, wobei jedes Element eine Liste mit 3 Elementen hat.

Mein Code, den ich für die Schleife so weit haben, ist (Up_xyz, Mid_xyz, Down_xyz Ausgänge in [x, x, x] Format):

for i in range (1,len(PeopleName)):  
    x = np.vstack((Up_xyz(TempName[i]),Mid_xyz(TempName[i]),Down_xyz(TempName[i]))) 
restA.append(x) 
l+=1 

was zur Folge hat:

[array([[ 88. , 42.5, 13. ], 
    [ 117.5, 72. , 42.5], 
    [ 163. , 117.5, 88. ]])] 

Dies ist einfach der Wert aus der letzten Iteration der Schleife.

Auch wenn ich anhängen y Resta mit

print(y.append(restA)) 

bekomme ich diesen Fehler:

'numpy.ndarray' object has no attribute 'append' 

Ich nehme an, dies auf die Differenz in Schlichte zurückzuführen ist. Aber ich würde jede Hilfe zu schätzen wissen, und ich bin ziemlich neu bei Python, also wäre ich offen für alle anderen Möglichkeiten, die auch effizienter wären.

Dank
+0

Wenn die Elemente im Array Python-Listen sind, warum Sie verwenden numpy brauchen? Kannst du nur mit Python-Listen auskommen – wwii

Antwort

1

Sie sollten für Schleife innerhalb der hängen

for i in range (1,len(PeopleName)):  
    x = np.vstack((Up_xyz(TempName[i]),Mid_xyz(TempName[i]),Down_xyz(TempName[i]))) 
    restA.append(x) 
l+=1 

Numpy Array-Objekt nicht über eine Methode append. Vielleicht möchten:

y = np.append(y, restA) 
+0

Danke! Der erste Teil hat funktioniert, ich hätte das früher fangen sollen. Der Teil 'y = np.append (y, restA)' endete damit, einen Spaltenvektor zu erzeugen. Hast du irgendwelche Vorschläge? Hat das etwas mit der Achse zu tun? – Questions

2

Es existiert np.append, aber es ist sehr kostspielig in einer Schleife (wenn Sie eins nach dem anderen anhängen).Siehe documentation:

A copy of arr with values appended to axis. Note that append does not occur in-place: a new array is allocated and filled. If axis is None, out is a flattened array.

A kopiert das Array für jeden Teilbereich Ihrer Schleife fertig ist (hier sind es nur 3 Schritten ist, aber ich denke, es ist keine gute Praxis ist, das zu tun, bewusst sein)

Ok Sie haben 3-Arrays, und Sie wollen jeden fusionieren:

import numpy as np 

a = np.array([[ 1., 1., 1.], 
       [ 1., 1., 1.], 
       [ 1., 1., 1.]]) 

b = np.array([[ 88., 42.5, 9. ], 
       [ 121.5, 76., 42.5], 
       [ 167., 121.5, 88. ]]) 

c = np.array([[ 88., 42.5, 13. ], 
       [ 117.5, 72., 42.5], 
       [ 163., 117.5, 88. ]]) 

result = np.empty((3,3), dtype=object) 

n, p = result.shape 
for i in range(n): 
     result[i, 0] = a[i,:] 
     result[i, 1] = b[i,:] 
     result[i, 2] = c[i,:] 

print(result) 

Ausgang:

array([[array([ 1., 1., 1.]), array([ 88. , 42.5, 9. ]), 
     array([ 88. , 42.5, 13. ])], 
     [array([ 1., 1., 1.]), array([ 121.5, 76. , 42.5]), 
     array([ 117.5, 72. , 42.5])], 
     [array([ 1., 1., 1.]), array([ 167. , 121.5, 88. ]), 
     array([ 163. , 117.5, 88. ])]], dtype=object) 

Wenn Sie list statt np.array wollen tun:

n, p = result.shape 
for i in range(n): 
    result[i, 0] = a[i,:].tolist() 
    result[i, 1] = b[i,:].tolist() 
    result[i, 2] = c[i,:].tolist() 

print(result) 

Ausgang:

[[[1.0, 1.0, 1.0] [88.0, 42.5, 9.0] [88.0, 42.5, 13.0]] 
[[1.0, 1.0, 1.0] [121.5, 76.0, 42.5] [117.5, 72.0, 42.5]] 
[[1.0, 1.0, 1.0] [167.0, 121.5, 88.0] [163.0, 117.5, 88.0]]] 

Es ist ein bisschen seltsam, einen 2D-Array zu haben, wobei jedes Element ein 1D-Array ist.

können Sie direkt ein 3D-Array (3,3,3) Form mit:

np.stack([a,b,c]) 
+0

Aber für meinen Fall würde ich die Anzahl der Matrizen, die produziert werden, nicht wissen, es kann 2 oder bis zu 30 sein. Da Sie jeder Matrize Variablen einzeln zuweisen, nehme ich an, dass diese Methode nicht für meinen Fall funktioniert? – Questions

+0

Sie können beliebig viele Objekte in einer Schleife auflisten. – hpaulj

+0

Versuchen Sie 'np.stack ([a, b, c])' Dies sollte ein Form (3,3,3) Array erstellen. – hpaulj

Verwandte Themen