2017-06-09 73 views
0

當我想要將矢量分配給矩陣中列的一部分時,它失敗。這裏是一個小例子:numpy無法將值分配給列的一部分

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

但這個工程:

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

爲什麼第一個例子不能工作?我錯過了什麼嗎?

+1

聲音['relevant'(https://開頭stackoverflow.com/a/44262976/3293881)。 – Divakar

回答

1

當您在數組上使用[]時,它將返回您正在引用的數組片的副本,或者準備好分配給該特定片。

所以當你做a[slc1][slc2] = stuffa[slc1]現在的a副本,稱之爲a_使a[slc1][slc2]相同a_[slc2]

然後,您將該副本分配給a[slc1][slc2] = stuffa_[slc2] = stuff相同。這很好,但你已經分配給一個只是臨時創建的變量。

而是做同樣的作業

a[slc1, slc2] = stuff 

內,或者在你的情況分配

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

請與(a[[0, 2], 2] == x).all()將返回True

+0

如果'slc1'是一個切片(':2'),間歇值是一個視圖,並且分配會影響原始數組。當'slc1'是一個列表或數組時,會生成副本。如果可能,仍然使用一組[]進行索引。 – hpaulj