2016-12-29 7 views
-1

Ich habe ein Array:numpy einfügen und anhängen

X ndarray 180x360 

Die folgenden nicht

X = numpy.append(X, X[:,0], 1) 

funktioniert, weil X[:,0] die falschen Dimensionen hat.

Ist das nicht komisch?

Auf diese Weise, um das Problem scheint ein wenig schmutzig:

X = numpy.append(X, numpy.array(X[:,0],ndmin=2).T, axis=1) 

In MATLAB konnte man nur schreiben: X(:,361) = X(:,1) !!!

Ich kam zu der Erkenntnis, dass dies funktioniert, auch:

X = numpy.insert(X, 361, X[:,0], axis=1) 

aber warum append ähnlich funktioniert nicht?

Danke Schlangen

Antwort

0

Sie können eine neue Achse auf X[:,0] erstellen:

np.append(X, X[:,0,None], axis=1) 

Ich denke, der Grund, warum Sie Array Formen übereinstimmen müssen, ist, dass numpy.appendconcatenate mit umgesetzt wird.

0

Der Grund ist, dass die Indizierung mit einer ganzen Zahl entfernt, dass Achse:

>>> X[:, 0].shape 
(180,) 

dass ein eindimensionales Array ist, aber wenn Sie Index einen Start zu geben und stoppen halten Sie die Achse:

>>> X[:, 0:1].shape 
(180, 1) 

, die richtig mit dem Array angehängt werden könnte:

>>> np.append(a, a[:, 0:1], 1) 
array([....]) 

Aber all dies beiseite, wenn Sie feststellen, selbst appending und concatenating viele Arrays gewarnt werden: Diese sind äußerst ineffizient. Die meiste Zeit ist es besser einen anderen Weg, dies zu tun zu finden, zum Beispiel eine größere Array am Anfang zu schaffen und dann Setzen Sie einfach die Zeilen/Spalten durch Schneiden:

X = np.zeros((180, 361)) 
X[:, 360] = X[:, 0] # much more efficient than appending or inserting 
0

Ein wesentlicher Unterschied besteht darin, dass in MATLAB alles hat mindestens 2 Dimensionen.

>> size(x(:,1)) 
ans = 
    2 1 

und wie Sie beachten, erlaubt es die Indizierung 'beyond-the-end' - weit über

>> x(:,10)=x(:,1) 
x = 
    1 2 3 1 0 0 0 0 0 1 
    4 5 6 4 0 0 0 0 0 4 

Aber in numpy Indizierung reduziert die Dimensionen, ohne die 2. Etage:

In [1675]: x = np.ones((3,4),int) 
In [1676]: x.shape 
Out[1676]: (3, 4) 
In [1677]: x[:,0].shape 
Out[1677]: (3,) 

Das bedeutet, wenn ich eine Spalte replizieren möchte, muss ich sicherstellen, dass es immer noch eine Spalte in der concatenate ist. Dafür gibt es zahlreiche Möglichkeiten.

x[:,0][:,None] - Verwendung von np.newaxis (alias None) ist eine schöne allgemeine Methode. x[:,[0]], x[:,0:1], x[:,0].reshape(-1,1) haben auch ihren Platz.

append ist nur concatenate, die die Liste der Argumente mit 2 ersetzt. Es ist eine verwirrende Nachahmung der Liste append. Es ist Python geschrieben, so dass Sie es lesen können (wie erfahrene MATLAB-Programmierer tun).

insert ist eine kompliziertere Funktion (auch in Python). Hinzufügen am Ende tut es so etwas wie:

In [1687]: x.shape 
Out[1687]: (3, 4) 
In [1688]: res=np.empty((3,5),int) 
In [1689]: res[:,:4] = x 
In [1690]: res[:,-1] = x[:,0] 

Die letzte Zuordnung funktioniert, weil beide Seiten die gleiche Form haben (technisch sie müssen nur sende Formen sein). So sagt uns insert nichts darüber, was sollte in grundlegenden Operationen wie concatenate funktionieren.

Verwandte Themen