webentwicklung-frage-antwort-db.com.de

So fügen Sie einem Numpy-Array Elemente hinzu

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?

67
goh

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:

124
Paul
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]])
13
eumiro

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]])
7
chvck

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]])
4
Schauff

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]])
1
ayorgo

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.]])
1
JoshAdel