我有一个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}
我认为可以使用替换全部,但是有什么规则可以实现这个目标?
谢谢!
答案 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使用的语法,函数所使用的参数名称为#
。Boole
将True
/ False
转换为1
/ 0
。因此,总的来说,我们创建了一个匿名函数,将其输入与2
进行比较,并提供0
或1
。然后将此函数映射到列表中。
答案 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}