wenn ich mit einer 3x4-Array zu starten, und eine 3x1-Array verketten, mit der Achse 1, erhalte I einen 3x5-Array:
In [911]: x = np.arange(12).reshape(3,4)
In [912]: np.concatenate([x,x[:,-1:]], axis=1)
Out[912]:
array([[ 0, 1, 2, 3, 3],
[ 4, 5, 6, 7, 7],
[ 8, 9, 10, 11, 11]])
In [913]: x.shape,x[:,-1:].shape
Out[913]: ((3, 4), (3, 1))
beachte, dass beiden Eingänge 2 Dimensionen verketten.
Auslassen der :
und x[:,-1]
(3,) Form - es 1d ist, und damit die Fehler:
In [914]: np.concatenate([x,x[:,-1]], axis=1)
...
ValueError: all the input arrays must have same number of dimensions
Der Code für np.append
ist (in diesem Fall, wo Achse angegeben)
return concatenate((arr, values), axis=axis)
Also mit einer leichten Änderung der Syntax append
funktioniert. Statt einer Liste benötigt es 2 Argumente. Es imitiert die Liste append
ist Syntax, sollte aber nicht mit dieser Listenmethode verwechselt werden.
In [916]: np.append(x, x[:,-1:], axis=1)
Out[916]:
array([[ 0, 1, 2, 3, 3],
[ 4, 5, 6, 7, 7],
[ 8, 9, 10, 11, 11]])
np.hstack
zuerst stellt sicher, dass alle Eingänge sind atleast_1d
und dann verketten hat:
return np.concatenate([np.atleast_1d(a) for a in arrs], 1)
So erfordert es die gleiche x[:,-1:]
Eingang. Im Wesentlichen die gleiche Aktion.
np.column_stack
macht auch ein Verketten auf der Achse 1. Aber zuerst leitet es 1d Eingänge durch
array(arr, copy=False, subok=True, ndmin=2).T
Dies ist eine allgemeine Art und Weise ist die Dreh (3) in eine Matrix (3,1) Array.
In [922]: np.array(x[:,-1], copy=False, subok=True, ndmin=2).T
Out[922]:
array([[ 3],
[ 7],
[11]])
In [923]: np.column_stack([x,x[:,-1]])
Out[923]:
array([[ 0, 1, 2, 3, 3],
[ 4, 5, 6, 7, 7],
[ 8, 9, 10, 11, 11]])
Alle diese ‚Stacks‘ kann bequem sein, aber auf lange Sicht ist es wichtig, Dimensionen zu verstehen und die Basis np.concatenate
. Außerdem wissen Sie, wie Sie den Code für Funktionen wie diesen nachschlagen. Ich benutze die ipython
??
Magie sehr.
Und in Zeittests ist die np.concatenate
merklich schneller - mit einem kleinen Array wie diesem macht die zusätzliche Schichten von Funktionsaufrufen einen großen Zeitunterschied.
Versuchen Sie 'np.column_stack'. – Divakar
Es hat funktioniert! Aber warum? – odo22