質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1319閲覧

numpy ブールインデックス参照+ファンシーインデックスによる代入ができない

sk1210

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/15 10:47

編集2021/12/15 11:39

問題(ブールインデックス参照+ファンシーインデックスによる代入ができない)

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

なぜうまく代入されないのか、どうしたらうまく代入されるのかについて、どちらかでもわかる方いらっしゃったら教えてほしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2021/12/15 11:13

その代入結果として想定される(更新された)matrix1の内容を提示すると回答得られやすくなるかと思います。
sk1210

2021/12/15 11:44

コメントいただきありがとうございます!想定される理想の出力を追記してみました。 やりたいことが複雑ですが、もしなにか細かいことでもわかればお教えいただければ幸いです。
guest

回答1

0

自己解決

np.whereを使えばできることがわかりました。(なぜブールインデックス参照+ファンシーインデックスによる代入ができないのかは未解決です。。)

>>> index_list = np.where(matrix2==0) >>> matrix2[index_list[0][list1],index_list[1][list1]] = list2 >>> matrix2 array([[0., 0., 0., 2., 0.], [0., 4., 1., 1., 1.], [0., 0., 1., 1., 1.], [6., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]])

投稿2021/12/15 11:57

sk1210

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2021/12/15 12:23

ブールインデックスでは、元の配列の参照ではなくコピーを返すので、matrix1[matrix2==0]に変更を加えても、元のmatrix1は変更されないです。
sk1210

2021/12/15 12:52

> ブールインデックスでは、元の配列の参照ではなくコピーを返す ありがとうございます!コメントをいただいてから調べてみたのですが、確かにそのようですね。 ブールインデックス・ファンシーインデックス共に原則はコピーを返すものである。だけれども、上記2種インデックスによる参照値に"直接"代入する場合にのみ、もとの配列に入力されるという感じなのかな、と理解しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問