Ich muss die folgende Aufgabe erfüllen:
von:
a = array([[1,3,4],[1,2,3]...[1,2,1]])
(füge ein Element zu jeder Zeile hinzu) um:
a = array([[1,3,4,x],[1,2,3,x]...[1,2,1,x]])
Ich habe versucht, Dinge wie ein [n] = Array ([1,3,4, x]) zu tun
aber numpy klagte über Formungleichheit. Ich habe versucht, a
zu durchlaufen und Element x an jedes Element anzuhängen, aber die Änderungen werden nicht wiedergegeben.
Irgendwelche Ideen, wie ich das erreichen kann?
Das Anhängen von Daten an ein vorhandenes Array ist eine Selbstverständlichkeit für jeden, der über die Erfahrung von python) verfügt. Wenn Sie jedoch regelmäßig an große Arrays anhängen, werden Sie schnell feststellen, dass NumPy dies nicht tut. ' Dies kann auf einfache oder effiziente Weise auf die Art und Weise geschehen, die ein python list
ausführen wird. Sie werden feststellen, dass jede "Anfügungs" -Aktion eine Neuzuweisung des Array-Speichers und eine kurzfristige Verdopplung erfordert Daher besteht die allgemeinere Lösung des Problems darin, zu versuchen, Arrays zuzuweisen, die so groß sind wie die endgültige Ausgabe Ihres Algorithmus. Führen Sie dann alle Ihre Operationen für Teilmengen aus ( slices ). Die Erzeugung und Zerstörung von Arrays sollte idealerweise minimiert werden.
Das heißt, es ist oft unvermeidlich und die Funktionen, die dies tun, sind:
für 2-D-Arrays:
für 3-D-Arrays (das obige Plus):
für N-D-Arrays:
import numpy as np
a = np.array([[1,3,4],[1,2,3],[1,2,1]])
b = np.array([10,20,30])
c = np.hstack((a, np.atleast_2d(b).T))
gibt c
zurück:
array([[ 1, 3, 4, 10],
[ 1, 2, 3, 20],
[ 1, 2, 1, 30]])
Eine Möglichkeit (möglicherweise nicht die beste) besteht darin, ein weiteres Array mit den neuen Elementen zu erstellen und column_stack auszuführen. d.h.
>>>a = array([[1,3,4],[1,2,3]...[1,2,1]])
[[1 3 4]
[1 2 3]
[1 2 1]]
>>>b = array([1,2,3])
>>>column_stack((a,b))
array([[1, 3, 4, 1],
[1, 2, 3, 2],
[1, 2, 1, 3]])
Das Anhängen eines einzelnen Skalars könnte, wie bereits gezeigt, ein wenig einfacher sein (und auch ohne Konvertierung in float), indem der Skalar zu einem Python-List-Typ erweitert wird:
import numpy as np
a = np.array([[1,3,4],[1,2,3],[1,2,1]])
x = 10
b = np.hstack ((a, [[x]] * len (a) ))
gibt b
zurück als:
array([[ 1, 3, 4, 10],
[ 1, 2, 3, 10],
[ 1, 2, 1, 10]])
Das Anhängen einer Zeile kann erfolgen durch:
c = np.vstack ((a, [x] * len (a[0]) ))
gibt c
zurück als:
array([[ 1, 3, 4],
[ 1, 2, 3],
[ 1, 2, 1],
[10, 10, 10]])
np.insert kann auch für diesen Zweck verwendet werden
import numpy as np
a = np.array([[1, 3, 4],
[1, 2, 3],
[1, 2, 1]])
x = 5
index = 3 # the position for x to be inserted before
np.insert(a, index, x, axis=1)
array([[1, 3, 4, 5],
[1, 2, 3, 5],
[1, 2, 1, 5]])
index
kann auch ein list
/Tuple
sein
>>> index = [1, 1, 3] # equivalently (1, 1, 3)
>>> np.insert(a, index, x, axis=1)
array([[1, 5, 5, 3, 4, 5],
[1, 5, 5, 2, 3, 5],
[1, 5, 5, 2, 1, 5]])
oder a slice
>>> index = slice(0, 3)
>>> np.insert(a, index, x, axis=1)
array([[5, 1, 5, 3, 5, 4],
[5, 1, 5, 2, 5, 3],
[5, 1, 5, 2, 5, 1]])
Wenn x
nur ein einzelner Skalarwert ist, können Sie so etwas versuchen, um die korrekte Form des Arrays zu gewährleisten, das an die Spalte ganz rechts von a
angehängt/verkettet wird:
import numpy as np
a = np.array([[1,3,4],[1,2,3],[1,2,1]])
x = 10
b = np.hstack((a,x*np.ones((a.shape[0],1))))
gibt b
zurück als:
array([[ 1., 3., 4., 10.],
[ 1., 2., 3., 10.],
[ 1., 2., 1., 10.]])