Pythonでリストから複数の値を取り出したい場合、連続していればスライスで取り出せますが、連続していない場合はどう取り出すのか分からなかったので調べました。
#検証環境
- Python 2.7
#方法
##itemgetterを使う方法
python2.5以降からitemgetter
が使えるようなのでそれを使ってみます。
リストでインデックスを渡せばそのインデックスの値が返ってきます。
from operator import itemgetter
a = ("a", "b", "c", "d", "e")
print itemgetter(1,3)(a) # ('b', 'd')
なぜこういうことをしたくなったかというと、機械学習させてラベルが返ってくるのはいいのですが、そこから元データを取り出す場合、簡単に書く方法が思いつかなかったからです。
例えば小文字化大文字化を判別させる分類器で、ラベルが返ってきてそこから大文字のものだけを取り出す場合は以下のように書きました。
from operator import itemgetter
import numpy
label_prediction = numpy.array([0,0,1,1,0,1])
data = ["a","b","C","D","e","F"]
label_match = numpy.where(label_prediction==1)[0]
print itemgetter(*label_match)(data)
他にもいい方法があったらどしどし教えて下さい。
##numpyを使う方法
s-wakabaさんから教えて頂きました!ありがとうございます。
文字列だとnumpy使えないーなどと勝手に悲観しておりましたが、普通に使えました。
itemgetter使うよりはるかに美しいです。
import numpy
label_prediction = numpy.array([0,0,1,1,0,1])
data = ["a","b","C","D","e","F"]
print numpy.array(data)[label_prediction==1]
調べたこと書いておくとより良い方法とか教えてもらえて助かりますね。
どんどんメモして無知をさらけ出していきたいと思います。