2017-06-09 5 views
0

Wenn ich einem Teil einer Spalte in einer Matrix einen Vektor zuweisen möchte, ist ein Fehler aufgetreten. Hier ist ein kleines Beispiel:numpy kann einem Teil einer Spalte keine Werte zuweisen

>>> a = np.random.randn(3,4) 
>>> a 
array([[ 0.12263942, -0.21972043, -0.97263544, 0.10609172], 
     [ 0.27012565, 1.0006549 , 0.80596588, -0.2954019 ], 
     [-0.28402912, -2.62405207, -0.52560166, 0.07325703]]) 
>>> x 
array([-0.33707461, 0.66196137]) 
>>> a[np.array([0,2])][:,2] = x 
>>> a[np.array([0,2])][:,2] 
array([-0.97263544, -0.52560166]) 

Aber das funktioniert:

>>> a = np.random.randn(3,4) 
>>> a 
array([[ 0.45379867, 0.38782073, -0.01432557, -1.03457707], 
     [ 1.27650459, 0.4480737 , -1.31625142, 2.00037792], 
     [ 0.77420762, 1.20131941, -0.98937721, -0.04921255]]) 
>>> x2 = np.random.randn(3) 
>>> x2 
array([-1.82217731, -0.72454628, -0.41954297]) 
>>> a[:,2] = x2 
>>> a[:,2] 
array([-1.82217731, -0.72454628, -0.41954297]) 

Warum das erste Beispiel kann nicht funktionieren? Vermisse ich etwas?

+1

Sounds [ 'relevant'] (https zurück: // stackoverflow.com/a/44262976/3293881). – Divakar

Antwort

1

Wenn Sie [] für ein Array verwenden, gibt es entweder eine Kopie des Array-Slices zurück, auf das Sie verweisen, oder Sie können diesem bestimmten Segment zuweisen.

Also, wenn Sie a[slc1][slc2] = stuff tun, a[slc1] ist jetzt eine Kopie von a, nennen es a_ so dass a[slc1][slc2] die gleiche wie a_[slc2] ist.

Dann zuweisen Sie diese Kopie mit a[slc1][slc2] = stuff das gleiche wie a_[slc2] = stuff. Das ist in Ordnung, aber Sie haben eine Variable zugewiesen, die nur vorübergehend erstellt wurde.

Stattdessen tun, um die Zuordnung innerhalb der gleichen Zuordnung

a[slc1, slc2] = stuff 

Oder in Ihrem Fall

a[[0, 2], 2] = x 

prüfen mit (a[[0, 2], 2] == x).all() wird True

+0

Wenn 'slc1' eine Scheibe (': 2') ist, ist der intermittierende Wert eine Ansicht und die Zuweisung wirkt sich auf das ursprüngliche Array aus. Die Kopie wird erzeugt, wenn "slc1" eine Liste oder ein Array ist. Die Indizierung mit einem Satz von [] ist - wenn möglich - vorzuziehen. – hpaulj

Verwandte Themen