🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

2回答

455閲覧

Python:抽出方法について

ttoo

総合スコア126

Python 3.x

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

0グッド

0クリップ

投稿2019/11/04 12:19

np.random.seed(123) X = np.random.random(size=(100, 2)) y = (X[:, 1] > 2*(X[:, 0]-0.5)**2 + 0.5).astype(int) fig, ax = plt.subplots() ax.scatter(X[y == 0, 0], X[y == 0, 1], marker='x', label='class 0') ax.scatter(X[y == 1, 0], X[y == 1, 1], marker='o', label='class 1') ax.legend() plt.show()

上記コードの「X[y == 0, 0], X[y == 0, 1]」について、
こちらはどのようにしてX変数から値を抽出しているのか詳細を知りたいです。

条件式のy == 0, 0がX変数とどのような構造なのかが分からないです。

よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

理解する上で、幾つか知っておかないといけないことがあります。一つずつ説明します。それぞれは単純です。

その1

numpy配列に対して比較演算を行うとboolの配列ができます。

python

1>>> import numpy as np 2>>> a = np.arange(10) 3>>> a 4array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 5>>> a > 5 6array([False, False, False, False, False, False, True, True, True, 7 True]) 8>>> a == 3 9array([False, False, False, True, False, False, False, False, False, 10 False])
その2

boolの配列を使って配列から値を取り出せます。

python

1>>> a % 2 == 0 # 偶数かどうか 2array([ True, False, True, False, True, False, True, False, True, 3 False]) 4>>> a[a % 2 == 0] 5array([0, 2, 4, 6, 8])
その3

二次元配列に対するインデクシングては、カンマで区切って行、列に対してそれぞれ取り出し方を指定することができます。

python

1>>> a = np.arange(15).reshape(3, 5) 2>>> a 3array([[ 0, 1, 2, 3, 4], 4 [ 5, 6, 7, 8, 9], 5 [10, 11, 12, 13, 14]]) 6>>> a[0, 3] 73 8>>> a[2, 1] 911

上の例では要素を取り出しています。他に、こういうこともできます。

python

1>>> a = np.arange(15).reshape(3, 5) 2>>> a[:,0] 3array([ 0, 5, 10])

:というのはスライスのリテラルで、この場合は特に何も指定していないので無条件ですべて取れという指示になります。行方向にはすべて取る、列方向で0を指定。すると0列目を取得することができます(一次元配列として結果が得られますが、これはそういうものだと思ってください)。

組み合わせる

質問文のコードでXはこんなデータです(中身は適当です)。

python

1>>> X = np.arange(12).reshape(6, 2) 2>>> X 3array([[ 0, 1], 4 [ 2, 3], 5 [ 4, 5], 6 [ 6, 7], 7 [ 8, 9], 8 [10, 11]])

X[y==0, 0]なら、行方向ではy==0の要素がTrueのところだけ抜き出す、列方向では0列目だけ抜き出すという指定の仕方になります。

python

1>>> X[[True, False, True, False, True, False], 0] 2array([0, 4, 8])
体系的に理解する場合

公式のここを見ると良いと思います。

Indexing — NumPy v1.17 Manual

投稿2019/11/04 13:23

hayataka2049

総合スコア30935

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

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

0

まず、X[:, 1] > 2*(X[:, 0]-0.5)**2 + 0.5の演算結果がFalse or Trueの100個のリストになります。
そして(X[:, 1] > 2*(X[:, 0]-0.5)**2 + 0.5).astype(int)を実施するととFalseは0、Trueは1に変換されます。つまりyは0 or 1で構成される100個の配列です。

y == 0を実行すると0だった要素はTrue、1だった要素はFalseの配列ができます。
y == 1は逆に1だった要素はTrue、0だった要素はFalseの配列ができます。

最後のX[y == 0, 0]ですが展開すると
X[ [ True True True True True False True False True False False False True True False True True True False True True True True False False False False True False True False False True True True False False True True True False True True True True False False False True True False True False True True True False False False True True True False True True True False True True False True True False True False False True True False True False True False False True True False True True True True False False True True False False True True True], 0]となります。結果としてはXにおいてTrueになる要素は採用され、Falseになる要素は無視された配列ができます。

わかりやすく説明するなら

>>> import numpy as np >>> a = np.array([1,2]) >>> a[[True, False]] array([1]) >>> a[[False, True]] array([2]) >>> a[[True, True]] array([1, 2])

今回の場合はX[y == 0, 0]は60個の配列、X[y == 1, 0]は40個の配列になっているみたいですね。

投稿2019/11/04 13:00

nomuken

総合スコア1627

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問