@ilovedog0123 (Hiroyuki Iwasa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

matplotlib 配列引数で==0とは?

Pythonをはじめて3ヵ月くらいとなります。現在、書籍「Pythonによるデータ分析の教科書」にて勉強中です。
matplotlibメソッドの引数で以下の様な記述があるのですが、どう解釈していいのか分からず困っています。

 X[y_km == 0, 0], X[y_km == 0, 1]

y_km == 0なら0と読むのでしょうか?
どなたか分かりやすく教えていただけないでしょうか。宜しくお願いします。

【引用スクリプト】

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()

散布図(クラスタ1)

ax.scatter(X[y_km == 0, 0], X[y_km == 0, 1], s=50,
edgecolor='black', marker='s', label='cluster 1')

クラスタ中心(クラスタ1)

ax.plot(np.mean(X[y_km == 0, 0]), np.mean(X[y_km == 0, 1]),
marker='x', markersize=10, color='red')

散布図(クラス2)

ax.scatter(X[y_km == 1, 0], X[y_km == 1, 1], s=50,
edgecolor='black', marker='o', label='cluster 2')

クラスタ中心(クラスタ2)

ax.plot(np.mean(X[y_km == 1, 0]), np.mean(X[y_km == 1, 1]),
marker='x', markersize=10, color='red')

散布図(クラス3)

ax.scatter(X[y_km == 2, 0], X[y_km == 2, 1], s=50,
edgecolor='black', marker='v', label='cluster 3')

クラスタ中心(クラスタ3)

ax.plot(np.mean(X[y_km ==2, 0]), np.mean(X[y_km == 2, 1]),
marker='x', markersize=10, color='red')
ax.set_xlabel('Sepal Width')
ax.set_ylabel('Petal Width')
ax.legend()
plt.show()

0 likes

1Answer

Xy_km の定義が不明なので推測になりますが
これは NumPy 特有の構文ではないかと思われます。

np.array の変数に対して == 0 と書くと
要素が 0 のところは True, それ以外は False になるような配列が作られます。
例えば

p = np.array([0, 1, 0, 0, 1])

に対して p == 0 と書くと

np.array([True, False, True, True, False])

という配列が作られます。
で、さらに True, False を要素とする配列を、別の配列引数に渡すと
True の箇所だけの要素が抽出できます。

例えば

q = np.array([0, 1, 2, 3, 4])

に対して q[np.array([True, True, False, False, False])] と書くと

np.array([0, 1])

という配列が作られます。
これらを合わせると q[p == 0] の結果は

np.array([0, 2, 3])

という配列になります。

X[y_km == 0, 0] というのは X が2次元配列で
1次元目の配列引数に y_km == 0 を渡し、2次元目の引数に 0 を渡しているんだと思います。
つまり y_km の要素が 0 である行と同じ行を X から取り出し
さらにその 0 列目を参照しているということじゃないでしょうか。

1Like

Comments

  1. @ilovedog0123

    Questioner

    rinatzさん、解説有難うございます。
    本スクリプトの前提としては、Irisデータから3つの品種をk-meansクラスタリング法により分類するロジックでして、rinatzさんの言われているnumpyの解釈で良いと実感しました。3つのクラスタに分類する前段階で、
     y_km = km.fit_predict(X)
    により、クラスタ1をy_km=0、クラスタ2をy_km=1、クラスタ3をy_km=2
    としています。散布図を描く際にその座標をどのクラスタ分類のx,yなのかを抽出条件としているということで理解しました。
    numpyについての文法とテーブルのイメージが整理できていないと難しいですね。

Your answer might help someone💌