2016-03-22 17 views
4

ダミー変数のベクトルを作成したい(Oか1しか取れない)。私は、次のことをやっている:効率的な方法でPythonのダミー変数を作成する

data = ['one','two','three','four','six'] 
variables = ['two','five','ten'] 

を、私は、次の2つの方法を得た:

dummy=[] 
for variable in variables: 
    if variable in data: 
     dummy.append(1) 
    else: 
     dummy.append(0) 

やリストの内包と:

dummy = [1 if variable in data else 0 for variable in variables] 

結果はOKです:

>>> [1,0,0] 

機能を組み込んでいますか?すごい仕事?変数が何千もの場合はちょっと遅いです。

編集は:time.time()を使用しての結果: 私は、次のデータを使用しています:

data = ['one','two','three','four','six']*100 
variables = ['two','five','ten']*100000 
  • ループ(私の例から):2.11秒
  • リスト内包:1.55秒
  • リスト理解度(変数は集合の型である):0.0004992秒
  • ピーターの例:0.0004999秒
  • falsetrueから例:0.000502秒
+1

すなわち、 '変数=設定([ '2'、 '5'、 '10' ]) ' – SparkAndShine

+0

このような量のデータで作業している場合は、numpy配列やpandasシリーズやデータフレームを見たいかもしれません。 – MaxU

+1

@SparkandShine:実際のリテラルであれば、Python 2.7以降で中間の' list'をスキップできます'variables = {'two'、 'five'、 'ten'}'を使って 'set'を直接取得してください。 – ShadowRanger

答えて

7

あなたはsetdataを変換する場合は、ルックアップが速くなります。

また、またはFalseの場合は、ブール値を整数に変換して1または0を得ることもできます。

>>> int(True) 
1 

あなたはループを通ってセットを毎回作成したセーブように、各変数のデータのセットに__contains__を呼び出すことができます。

あなたは一緒にすべてのこれらをマップすることができます。

dummy = list(map(int, map(set(data).__contains__, variables))) 

を編集:私はワンライナーを好きなように

多く、私はそれは、リストの内包表記を使用する方が読みやすいと思います。

リストの理解度にsetを作成すると、variableごとに再作成されます。だから我々は、二行必要があります。

search = set(data) 
dummy = [int(variable in search) for variable in variables] 
+0

注: 'True'と' False'は既に '1'と' 0'で 'int'sです(' bool'は2つのシングルトンインスタンスと異なる表現を持つ 'int'のサブクラスです)。数式では 'True' /' False'を使うことができますので、 'real''を' '' '' '' '' '' '' '' ''として表現する必要がない限り、 '' int''変換を省略して 'リスト(map(set(data).__ contains__、variables)) '。正解BTW、up-voted。 – ShadowRanger

+1

@ShadowRanger OPが '[1、0、0]' –

+0

を知りました。私はそれを論理的に '' True、False、False ' 、0] 'を文字列表現とは別に使用するため、表示用ではなく内部使用のためだけに必要な場合は、ステップをスキップできます。私はあなたの答えが間違っているか不完全であると言っているわけではありません(私はそれがたくさん好きです;私は同じ状況でやっていることです)、ちょうどOPの利益のための精緻化としてこれを言います。 – ShadowRanger

2
  • 使用setからitem in setをあなたは1または0を取得するint型(ブール値)を使用することができますO(1)/ item in listテイクO(n)の
  • を取ります。(代わりに、条件式)、代わりlist` `の、速くなる` set`を使用

>>> data = ['one','two','three','four','six'] 
>>> variables = ['two','five','ten'] 
>>> xs = set(data) 
>>> [int(x in xs) for x in variables] 
[1, 0, 0] 
関連する問題