gpt4 book ai didi

wolfram-mathematica - 根据列表中的元素更改嵌套列表中的值

转载 作者:行者123 更新时间:2023-12-01 07:16:08 25 4
gpt4 key购买 nike

我在 mathematica 中有一个值对列表,例如 List= {{3,1},{5,4}} .

如果第二个元素未达到阈值,如何更改第一个元素(3 和 5)。例如,如果第二部分低于 2,那么我希望第一部分归零。那么该列表 = {{0,1},{5,4}} .不幸的是,其中一些列表非常长,因此手动执行它不是一种选择。

最佳答案

从概念上讲,一般的方法是使用 Map .在您的情况下,代码将是

In[13]:= lst = {{3, 1}, {5, 4}}

Out[13]= {{3, 1}, {5, 4}}

In[14]:= thr = 2

Out[14]= 2

In[15]:= Map[{If[#[[2]] < thr, 0, #[[1]]], #[[2]]} &, lst]

Out[15]= {{0, 1}, {5, 4}}
#这里的符号代表函数参数。您可以阅读有关纯函数的更多信息 here .双方括号代表 Part萃取。您可以使用 Apply 使它更简洁一些在级别 1,缩写为 @@@ :
In[27]:= {If[#2 < thr, 0, #], #2} & @@@ lst

Out[27]= {{0, 1}, {5, 4}}

但是请注意,对于大型数字列表,第一种方法要快几倍。一个更快,但更模糊的方法是这样的:
In[29]:= Transpose[{#[[All, 1]]*UnitStep[#[[All, 2]] - thr], #[[All, 2]]}] &[lst]

Out[29]= {{0, 1}, {5, 4}}

它更快,因为它使用非常优化的矢量化操作,这些操作同时适用于所有子列表。最后,如果你想要极致的性能,这个编译成 C 版本的程序会快 2 倍:
fn = Compile[{{lst, _Integer, 2}, {threshold, _Real}},
Module[{copy = lst, i = 1},
For[i = 1, i <= Length[lst], i++,
If[copy[[i, 2]] < threshold, copy[[i, 1]] = 0]];
copy], CompilationTarget -> "C", RuntimeOptions -> "Speed"]

你用它作为
In[32]:= fn[lst, 2] 

Out[32]= {{0, 1}, {5, 4}}

对于最后一个,您需要在您的机器上安装一个 C 编译器。

关于wolfram-mathematica - 根据列表中的元素更改嵌套列表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5449065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com