将列表中的所有值映射到= 2,为0

时间:2011-10-29 12:17:59

标签: wolfram-mathematica

我有一个mathematica列表,其中我想将所有2和1替换为0。

例如。

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

- >

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

我认为可以使用替换全部,但是有什么规则可以实现这个目标?

谢谢!

7 个答案:

答案 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使用的语法,函数所使用的参数名称为#
  • BooleTrue / False转换为1 / 0

因此,总的来说,我们创建了一个匿名函数,将其输入与2进行比较,并提供01。然后将此函数映射到列表中。

答案 1 :(得分:5)

您可以使用

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

我使用Replace而不是ReplaceAll来告诉Mathematica必须在哪个“level”进行替换(Replace的最后一个参数)

答案 2 :(得分:3)

如果您的列表是数字,我建议您:

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

1 - Unitize[2 - a]

由于时间数据已经在答案中引入,我将添加自己的数据点。

按顺序出现。使用Windows 7上的Mathematica 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
Unitize@Clip[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
Unitize@Clip[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

答案 3 :(得分:1)

尝试

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

利用ReplaceAll的以下属性:

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[]可以改为其他任何东西)。

答案 4 :(得分: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} *)

答案 5 :(得分:1)

或者这个

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

比其他所有其他产品快100倍左右,除了Szabolcs',它的速度提高了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}

答案 6 :(得分: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}