“Pythonではじめる機械学習”中、27番のコードで気になったので調べた結果。
Scitkit-learnを使ってk-最近傍法の予測結果を保存し、その結果を使って予測されたアヤメの種類を表示させている。
1 2 3 4 5 6 7 |
prediction = knn.predict(X_new) print("Prediction: {}".format(prediction)) print("Predicted target name] {}".format( \ iris_dataset['target_names'][prediction])) # Prediction: [0] # Predicted target name] ['setosa'] |
ここでprediction
、iris_dataset['target_names']
のいずれの型もnumpy.ndarray
であり、ndarray
の引数に整数ではなくてndarray
を使っている。
通常のリストでこれをやると、”リストのインデックスにリストを使ってはダメ”とエラーになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
a = ['a', 'b', 'c'] print(a) x = 0 print(a[x]) y = [0] print(a[y]) # ['a', 'b', 'c'] # a # ... # TypeError: list indices must be integers or slices, not list |
ところがndarray
の場合はその引数にndarray
を渡すことができて、結果はndarray
として帰ってくる。
1 2 3 4 5 6 7 8 9 10 11 12 |
import numpy as np a = np.array(['a', 'b', 'c']) x = 0 print("{}: {}".format(x, a[x])) y = np.array([0]) print("{}: {}".format(y, a[y])) # 0: a # [0]: ['a'] |
さらに、引数に渡す配列が複数の要素を持つ場合、各要素を引数とした場合に対応する元の配列の要素が配列として返される。
1 2 3 4 |
z = np.array([0, 2, 2, 1]) print("{}: {}".format(z, a[z])) # [0 2 2 1]: ['a' 'c' 'c' 'b'] |
なお、元の配列がndarray
であれば、引数に普通のリストを渡しても同じ結果が得られる。
1 2 3 4 |
u = [0, 2, 2, 1] print("{}: {}".format(u, a[u])) # [0, 2, 2, 1]: ['a' 'c' 'c' 'b'] |