問題(ブールインデックス参照+ファンシーインデックスによる代入ができない)
python, numpy を使って代入操作で少しトリッキーなこと(ブールインデックス参照+ファンシーインデックスによる代入)をしたいのですがうまくいきません。
前提
まず以下のようなmatrix1, matrix2, list1, list2を準備します。
>>> import numpy as np >>> matrix1 = np.zeros([5,5]) >>> matrix2 = np.zeros([5,5]) >>> matrix2[1:3,2:5] = 1 >>> list1 = np.array([3,6,9]) >>> list2 = np.array([2,4,6])
すると、各変数には以下の値が代入されます
>>> matrix1 array([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]]) >>> matrix2 array([[0., 0., 0., 0., 0.], [0., 0., 1., 1., 1.], [0., 0., 1., 1., 1.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]]) >>> list1 array([3, 6, 9]) >>> list2 array([2, 4, 6])
やりたいこと
matrix1の要素にlist2で指定した数字(2,4,6)を1か所ずつ代入したいです。この時に、代入する場所は、
matrix1[matrix2==0][list1]
で指定されるところです。すなわち、matrix2の要素のうち0である箇所に対応するmatrix1を配列として取り出して、その配列のlist1[i]番目にlist2[i] (i=0,1,2)を代入したいです。
起こっている問題
上記の内容を以下のように実装し、代入操作を行っても、値が変化しません。
>>> matrix1[matrix2==0][list1] array([0., 0., 0.]) >>> list2 array([2, 4, 6]) >>> matrix1[matrix2==0][list1] = list2 # 代入をするけど・・・ >>> matrix1[matrix2==0][list1] array([0., 0., 0.]) # 変化しない。(本来は array([2., 4., 6.])となってほしい)
本当は、matrix1は以下のようになってほしいです。(matrix2で0が入っている箇所に対応するところを取ってきて1次元リストを作ったとき、そのリストの(0-indexで)3,6,9番目に対応する要素にそれぞれ2,4,6を代入する)
>>> matrix1 # 理想の出力 array([[0., 0., 0., 2., 0.], [0., 4., 0., 0., 0.], [0., 0., 0., 0., 0.], [6., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]]) >>> matrix1 # 実際の出力 array([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]])
なぜうまく代入されないのか、どうしたらうまく代入されるのかについて、どちらかでもわかる方いらっしゃったら教えてほしいです。
回答1件
あなたの回答
tips
プレビュー