2016-08-08 23 views
0

Hallo Ich möchte Joining mehrere Arrays in Python verbinden, numpy mit mehrdimensionalen Arrays zu bilden, ist es für Schleife innerhalb eines ist, das ist ein Pseudo-CodeArray In Python

import numpy as np 
h = np.zeros(4) 
for x in range(3): 
    x1 = some array of length of 4 returned from a previous function (3,5,6,7) 
    h = np.concatenate((h,x1), axis =0) 

Die erste Iteration geht in Ordnung, aber während die zweite Iteration auf dem for-Schleife ich die folgende Fehlermeldung erhalten,

ValueError: all the input arrays must have same number of dimensions

das Ausgangsarray so etwas wie diese

[[0,0,0,0],[3,5,6,7],[6,3,6,7]] 
aussehen soll

usw.

Also, wie kann ich die Arrays verbinden?

Dank

+1

Muss es mit numpy sein? Sie können einfach tun 'list1.append (list2)' –

+0

Ich versuchte, aber es gibt den folgenden Fehler AttributeError: 'numpy.darray' Objekt hat kein Attribut 'append' – rksh

+0

Ich bezog sich auf Python-Listen, nicht numpy Arrays. –

Antwort

1

Sie müssen vstack verwenden. Es erlaubt Ihnen, Arrays zu stapeln. Sie nehmen eine Folge von Arrays und stapeln sie vertikal ein einzelnes Array

import numpy as np 
h = np.zeros(4) 
for x in range(3): 
    x1 = [3,5,6,7] 
    h = np.vstack((h,x1)) 
    # not h = np.concatenate((h,x1), axis =0) 

    print h 

Output zu machen: later

[[ 0. 0. 0. 0.] 
[ 3. 5. 6. 7.] 
[ 3. 5. 6. 7.] 
[ 3. 5. 6. 7.]] 

weitere Bearbeitungen. Wenn Sie cocatenate nur verwenden möchten, können Sie auch die folgende Art und Weise tun:

import numpy as np 
h1 = np.zeros(4) 

for x in range(3): 
     x1 = np.array([3,5,6,7]) 
     h1= np.concatenate([h1,x1.T], axis =0) 

print h1.shape 
print h1.reshape(4,4) 

Ausgang:

(16,) 
[[ 0. 0. 0. 0.] 
[ 3. 5. 6. 7.] 
[ 3. 5. 6. 7.] 
[ 3. 5. 6. 7.]] 

Beide haben unterschiedliche Anwendungen. Sie können nach Ihren Bedürfnissen wählen.

1

Es ist am besten, Werte in einer Liste zu sammeln und die Verkettung oder Array-Erstellung am Ende einmal durchzuführen.

h = [np.zeros(4)] 
for x in range(3): 
    x1 = some array of length of 4 returned from a previous function (3,5,6,7) 
    h = h.append(x1) 
h = np.array(h) 
# or h = np.vstack(h) 

Alle concatenate/stack/array Funktionen nimmt eine Liste von mehreren Elementen. Das Anhängen an eine Liste ist schneller als das Verketten von 2 Elementen.

======================

versuchen Lassen Sie Ihren Ansatz Schritt für Schritt:

In [189]: h=np.zeros(4) 
In [190]: h 
Out[190]: array([ 0., 0., 0., 0.]) # 1d array (4,) shape 
In [191]: x1=np.array([3,5,6,7])  # another 1d 
In [192]: h1=np.concatenate((h,x1),axis=0) 
In [193]: h1 
Out[193]: array([ 0., 0., 0., 0., 3., 5., 6., 7.]) 
In [194]: h1.shape 
Out[194]: (8,)  # also a 1d array, but with 8 items 
In [195]: x1=np.array([6,3,6,7]) 
In [196]: h1=np.concatenate((h1,x1),axis=0) 
In [197]: h1 
Out[197]: array([ 0., 0., 0., 0., 3., 5., 6., 7., 6., 3., 6., 7.]) 

In diesem Fall ich m (4,) Arrays nacheinander hinzufügen, immer noch ein 1d-Array.

Wenn ich wieder ein erstellen x1 als 2d (1,4):

In [198]: h=np.zeros(4) 
In [199]: x1=np.array([[6,3,6,7]]) 
In [200]: h1=np.concatenate((h,x1),axis=0) 
... 
ValueError: all the input arrays must have same number of dimensions 

ich diese Dimension Fehler sofort.

Die Tatsache, dass Sie den Fehler in der 2. Iteration erhalten, schlägt vor, dass die erste x1 ist (4,), aber die zweite ist 2d.

Wenn Sie solche Dimensionsfehler haben, überprüfen Sie die Formen.

vstack fügt Dimensionen zu den Eingängen, je nach Bedarf, so können Sie 2D-Arrays erstellen:

In [207]: h=np.zeros(4) 
In [208]: x1=np.array([3,5,6,7]) 
In [209]: h=np.vstack((h,x1)) 
In [210]: h 
Out[210]: 
array([[ 0., 0., 0., 0.], 
     [ 3., 5., 6., 7.]]) 
In [211]: x1=np.array([6,3,6,7]) 
In [212]: h=np.vstack((h,x1)) 
In [213]: h 
Out[213]: 
array([[ 0., 0., 0., 0.], 
     [ 3., 5., 6., 7.], 
     [ 6., 3., 6., 7.]]) 
1

Es gibt mehrere Möglichkeiten, dies zu tun. Ich werde einige Beispiele aufzählen:

Zuerst importieren wir numpy und eine Funktion definieren, diese Arrays der Länge 4.

import numpy as np 

def previous_function_returning_array_of_length_4(x): 
    return np.array(range(4)) + x 

Der erste Weg erzeugt beinhaltet eine Liste von Arrays erstellen, dann numpy.array() Aufruf zu Konvertiere die Liste in ein 2D-Array.

h0 = np.zeros(4) 
arrays = [h0] 
for x in range(3): 
    x1 = previous_function_returning_array_of_length_4(x) 
    arrays.append(x1) 

h = np.array(arrays) 

Sie das gleiche tun mit np.vstack():

h0 = np.zeros(4) 
arrays = [h0] 
for x in range(3): 
    x1 = previous_function_returning_array_of_length_4(x) 
    arrays.append(x1) 

h = np.vstack(arrays) 

Alternativ, wenn Sie wissen, wie viele Arrays Sie erstellen wollen, können Sie das Array 2D erstellen erste und füllen Sie die Werte:

h = np.zeros((4, 4)) 
for ii in range(3): 
    x1 = previous_function_returning_array_of_length_4(ii) 
    h[ii + 1, ...] = x1 

Es gibt mehrere Möglichkeiten, aber hoffentlich gibt Ihnen das eine Idee, was zu tun ist.