2017-06-09 8 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] = stuffを行う際に、a[slc1]a[slc1][slc2]a_[slc2]と同じになるようにa_それを呼び出す、今aのコピーです。

次に、a[slc1][slc2] = stuffと同じコピーをa_[slc2] = stuffと割り当てます。どちらも問題ありませんが、一時的に作成された変数に割り当てられました。 //:

は、代わりに同じ割り当て

a[slc1, slc2] = stuff 

それとも、あなたのケースで(a[[0, 2], 2] == x).all()

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

チェックがTrue

+0

'slc1'がスライス( ':2')の場合、断続的な値はビューであり、割り当ては元の配列に影響します。コピーは、 'slc1'がリストまたは配列のときに生成されます。可能な場合は、[]の1つのセットでインデックスを作成することをお勧めします。 – hpaulj

関連する問題