2011-10-29 10 views
2

2つをすべて1に置き換え、それ以外は0に置き換えます。リストのすべての値を!= 2、0にマップする

たとえば、

{0,1,2,3,2,3,4,5,2,2,6} 

- >

{0,0,1,0,1,0,0,0,1,1,0} 

私はそれがすべてを置き換える使用して可能だと仮定しますが、どのようなルールはこれを実現するのでしょうか?

ありがとうございます!

答えて

8

機能(Boole[2 == #]) &をリストに割り当てることができます。異なる部分の

In[2]:= (Boole[2 == #]) & /@ {0, 1, 2, 3, 2, 3, 4, 5, 2, 2, 6} 
Out[2]= {0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0} 

説明:

  • /@がリストの各要素に関数を適用します。
  • () &は、anonymous functionsで使用される構文であり、関数のパラメータは#となります。
  • True/Falseから1/0に変換します。

ので、合計では、我々は2にその入力を比較し、匿名関数を、作成、および0または1のいずれかを提供します。この関数は、リストにマッピングされます。私は交換が行われ(Replaceの最後の引数)を取る必要がありますで「レベル」Mathematicaを伝えることができるようにReplaceの代わりReplaceAllを使用

+0

私はMathematicaの旅行で、この「神秘的なアンパサンド」を見てきました。あなたはそれが何をしているのか説明できますか? – VolatileStorm

+1

@VolatileStorm:関数を作成するだけです。この場合、関数は 'isTwo [n_]:= Boole [2 == n];'として定義することができ、 '(Boole [2 ==#])&'上記の例ではisTwo'です。 –

+2

'()&'ではなく、純関数に使われる '# - &'のペアです。 '()'は実行の優先順位を設定するだけであり、この場合は実行されません。 – abcd

5

あなたは

Replace[{0, 1, 2, 3, 2, 3, 4, 5, 2, 2, 6}, {2 -> 1, _ -> 0}, 1] 

を使用することができます

+0

しかし、 'MatchQ [{0,1,2,3,2,3,4,5,2,2,6}、_]'は 'True'を返します。 – acl

+0

申し訳ありませんが、間違った投稿の直後に訂正しましたが、最新のバージョンをすべての視聴者に配信するには少し遅くなりました。 – Szabolcs

1

てみてください

{0,1,2,3,2,3,4,5,2,2,6}/.{2->1,(x_/;MemberQ[Range[0,9],x])->0} 

012の性質を利用する:

The first rule that applies to a particular part is used; 
no further rules are tried on that part, or on any of its subparts. 

これは、(例えばRange[]は何か他のものに変更してもよい)、柔軟性のかなりが可能になります。あなたのリストが数値の場合

3

、私はこれをお勧めします。タイミングデータは、答えに導入された

a = {0, 1, 2, 3, 2, 3, 4, 5, 2, 2, 6}; 

1 - Unitize[2 - a] 

ので、私は自分のデータポイントを追加するものとします。

外観の順です。 Mathematica 7をWindows 7にインストールする。

まず、スパースマッチ(補数):

In[1]:= 
data = RandomInteger[{0, 40000}, 150000]; 
(Boole[2 == #]) & /@ data // timeAvg 
Replace[data, {2 -> 1, _ -> 0}, 1] // timeAvg 
1 - Unitize[2 - data] // timeAvg 
KroneckerDelta /@ (data - 2) // timeAvg 
[email protected][data, {2, 2}, {0, 0}] // timeAvg 

Out[2]= 0.0654 

Out[3]= 0.01684 

Out[4]= 0.0010224 

Out[5]= 0.106 

Out[6]= 0.00026944 

かつ緻密試合で:ちょうど楽しみのため

In[1]:= 
data = RandomInteger[{0, 5}, 150000]; 
(Boole[2 == #]) & /@ data // timeAvg 
Replace[data, {2 -> 1, _ -> 0}, 1] // timeAvg 
1 - Unitize[2 - data] // timeAvg 
KroneckerDelta /@ (data - 2) // timeAvg 
[email protected][data, {2, 2}, {0, 0}] // timeAvg 

Out[2]= 0.0656 

Out[3]= 0.01308 

Out[4]= 0.0013968 

Out[5]= 0.0842 

Out[6]= 0.000648 
+2

UnitizeがPossibleZeroQを比較に使用するので、これはいいです –

1

...

$v = {0, 1, 2, 3, 2, 3, 4, 5, 2, 2, 6}; 

KroneckerDelta /@ ($v - 2) 

(* returns {0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0} *) 
1

またはこの

lst={0,1,2,3,2,3,4,5,2,2,6}; 
Clip[ 
    lst, 
    {2,2}, 
    {0,0} 
] 

これはSzabolcs 'を除いて他のすべてよりも約100倍高速で、7倍高速です。

Timing[Do[Clip[lst, {2, 2}, {0, 0}];, {10000}]] 
{0.021858, Null} 

Timing[Do[KroneckerDelta /@ (lst - 2), {10000}]] 
{0.131487, Null} 

Timing[Do[1 - Unitize[2 - lst], {10000}];]  
{0.214324, Null} 

Timing[Do[ 
    lst /. {2 -> 1, (x_ /; MemberQ[Range[0, 9], x]) -> 0};, {10000}]] 
{0.533773, Null} 

Timing[Do[Replace[lst, {2 -> 1, _ -> 0}, 1];, {10000}]] 
{0.066136, Null} 
+0

答えにタイミング結果を追加してもらうことを願っています – Verbeia

+0

@Verbeiaはまったくありません。私はランダムに異なるタイミングを得る。私に見せてください – acl

+0

これは価値があるため、これらのタイミングは2年前のMacbook Pro、2.5GHzで行われました。 – Verbeia

0

ただ、完全酒のために、あなたはまた、独自の変換関数をロールバックすることができます:

In[1]:= TwoToOne[2] = 1; TwoToOne[_] = 0; 
In[2]:= Map[TwoToOne, {0, 1, 2, 3, 2, 3, 4, 5, 2, 2, 6}] 
Out[2]:= {0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0} 
関連する問題