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}
私はそれがすべてを置き換える使用して可能だと仮定しますが、どのようなルールはこれを実現するのでしょうか?
ありがとうございます!
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}
私はそれがすべてを置き換える使用して可能だと仮定しますが、どのようなルールはこれを実現するのでしょうか?
ありがとうございます!
機能(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,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[]
は何か他のものに変更してもよい)、柔軟性のかなりが可能になります。あなたのリストが数値の場合
、私はこれをお勧めします。タイミングデータは、答えに導入された
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
UnitizeがPossibleZeroQを比較に使用するので、これはいいです –
...
$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} *)
またはこの
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}
ただ、完全酒のために、あなたはまた、独自の変換関数をロールバックすることができます:
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}
私はMathematicaの旅行で、この「神秘的なアンパサンド」を見てきました。あなたはそれが何をしているのか説明できますか? – VolatileStorm
@VolatileStorm:関数を作成するだけです。この場合、関数は 'isTwo [n_]:= Boole [2 == n];'として定義することができ、 '(Boole [2 ==#])&'上記の例ではisTwo'です。 –
'()&'ではなく、純関数に使われる '# - &'のペアです。 '()'は実行の優先順位を設定するだけであり、この場合は実行されません。 – abcd