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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

6728閲覧

numpy 配列のインデックスに配列を指定する方法について

---stax---

総合スコア148

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/01/31 05:11

かなり初歩的な内容になります。
現在numpyについて学習しております。
要素のアクセスについてなのですが表題のインデックスに配列を指定する部分について動作がわかりません

python

1import numpy as np 2 3e = np.zeros((3, 3)) 4f = np.array([8, 9]) 5 6e[np.array([0, 2]), np.array([0, 1])] = f 7 8---------------------------------------- 9[[0. 0. 0.] 10 [0. 0. 0.] 11 [0. 0. 0.]] 12 1314 15[[8. 0. 0.] 16 [0. 0. 0.] 17 [0. 9. 0.]] 18

上記のような配列があったとして、なぜ上記のコードで
e[0, 0]とe[2, 1]の要素が選択され置き換わるのでしょうか?

python

1print(e[np.array([0, 2]), np.array([0, 1])])

とすると確かにe[0, 0]とe[2, 1]の要素が選択されているのですが
e[np.array([0, 2]), np.array([0, 1])]がなぜe[0, 0]とe[2, 1]を指せるのでしょうか。
numpy以前にpythonの理解度が低いだけかもしれませんがアドバイスお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

numpy の fancy indexing ですね。

今回 e は2次元配列なので、

e[axis=0 のインデックス, axis=1 のインデックス]

と指定します。axis は以下の図を見てください。

イメージ説明

よって、e[[0, 2], [0, 1]] とした場合
axis=0 は 0, 2 なので、0行目、2行目
axis=1 は 0, 1 なので、0列目、1列目
したがって、
(0行目、0列目)、(2行目、1列目) の2つの要素の部分配列になります。

追記

イメージ説明

投稿2019/01/31 05:50

編集2019/02/01 05:42
tiitoi

総合スコア21956

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

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

---stax---

2019/02/01 00:53

返答遅くなり申し訳ございません。 回答ありがとうございます。 axis=0やaxis=1というような使い方はしたことがあるのですがaxisに配列を考えるのは初めて見ました。 色々調べてみたのですがまだ分かりにくくaxisのインデックスの考え方が理解しにくいです axisの軸順は(行、列)の順だと認識しています。 axis=0(行方向)のインデックスが[0, 2]だと0行目2列目で図でいうa13になりaxis=1のインデックスが[0, 1]だと0行目1列目でa12にならないのが不思議です。 自分の考え方はどの部分からおかしいでしょうか? 初歩的な質問で申し訳ありません
tiitoi

2019/02/01 05:52 編集

> axisに配列を考えるのは初めて見ました。 axis はインデックスによるアクセスを行うための軸です。(追記の画像参照) 引数に指定する axis もその軸を意味しています。 > 自分の考え方はどの部分からおかしいでしょうか? 2次元配列の場合、axis=0 は行方向、axis=1 は列方向となります。 numpy で x[exp0, exp1, ..., exp(N - 1)] とインデックスをタプルで指定した場合、exp0 は axis=0 のインデックス、exp1 は axis=1 のインデックス、... の指定になります。 x[行方向のインデックス, 列方向のインデックス] なので、 x[[0, 2], [0, 1]] の場合、[0, 2] は両方とも行方向のインデックスを指していて、次に[0, 1]は両方とも列方向のインデックスを指しています。 そのため、0行目と2行目、0列目と1列目の選択となり、 その結果 a[0, 0], a[2, 1] にアクセスする結果となります。
---stax---

2019/02/04 01:47

回答ありがとうございます。 返答遅くなり大変申し訳ありません。 >x[行方向のインデックス, 列方向のインデックス] なので、 x[[0, 2], [0, 1]] の場合、[0, 2] は両方とも行方向のインデックスを指していて、次に[0, 1]は両方とも列方向のインデックスを指しています。 そのため、0行目と2行目、0列目と1列目の選択となり、 その結果 a[0, 0], a[2, 1] にアクセスする結果となります。 この部分がずっと理解できていませんでした。 イメージの例が正しいかわかりませんが以下のようなイメージで理解しました。 両方とも行のインデックス、列のインデックスと考えるとよく分からなかったのですが以下のように配列を当てはめているだけかもと思うと雰囲気が掴めました。 x = np.arange(1,10).reshape(3, 3) a = np.array([0, 2]) #axis=0(行の要素) b = np.array([0, 1]) #axis=1(列の要素) for (alist, blist) in zip(a, b): print(x[alist][blist])
tiitoi

2019/02/04 02:08

イメージとしてはそのような認識でよいですよ。 fancy indexing で調べると、情報がいろいろ得られるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問