gpt4 book ai didi

list - 如何在Mathematica中使用函数式编程减去列表中的特定元素?

转载 作者:行者123 更新时间:2023-12-04 13:24:56 25 4
gpt4 key购买 nike

我有以下格式的日期和值列表:

{{{dateInfo1},value1},{{dateInfo2},value2},...,{{dateInfoN},valueN}}

带有一些实际的日期和值:
{{{1971, 1, 31, 0, 0, 0.}, 1.0118}, {{1971, 2, 28, 0, 0, 0}, 1.0075},
..., {{2010, 5, 31, 0, 0, 0.}, 1.0403}}

对于那些好奇的人,这是从 FRED database中提取的美元兑加元汇率的列表。

我想简单地从值2中减去value1,然后使用以下形式的数据创建一个新列表:
 {{{dateInfo1},0},{{dateInfo2},change1},...,{{dateInfoN},changeN-1}}

(其中change1为value2-value1)

我知道使用函数式编程必须有一种相对简单的方法,这与使用索引变量和计数以及所有这些废话的Do或While相反。我尝试实现的方法必须相对可靠,因为我会自动从具有相同格式但时间间隔不同的源中提取数据集。如果我不必指定ListPlot日期间隔,那么重新绘制就容易得多了(如果我从列表中删除dateInfo,就会发生这种情况)。

我熟悉文档中心和非编程Mathematica功能。我一直在用Mathematica学习编程,并且确实想将这种能力扩展到函数式编程中,但是发现有关该主题的大多数资源都有些困难。我感觉自己正处在学习曲线即将到位的高峰,但现在我正在挣扎。至少,如果您对函数式编程有很好的了解,我将非常乐于研究这些知识!任何帮助深表感谢!抱歉,如果是TMI,但我敢肯定你们中的许多人也有同样的感觉。

最佳答案

您有一个{date,value}对的列表,因此如果Transpose,则将有两个列表的列表-第一个是日期列表,第二个是对应值列表。
然后,您可以将值的Differences设为Prepend 0,然后再次进行转置以返回对对列表。

在代码中

data = {{{1971,1,31,0,0,0}, 1.0118}, 
{{1971,2,28,0,0,0}, 1.0075},
{{2010,5,31,0,0,0}, 1.0403}}
{dates, values} = Transpose[data];
diffs = Prepend[Differences[values], 0];
answer = Transpose[{dates, diffs}]

返回:
{{{1971,1,31,0,0,0}, 0}, 
{{1971,2,28,0,0,0}, -0.0043},
{{2010,5,31,0,0,0}, 0.0328}}

通过 Janus将其包装为一个函数:
taildiffs[data_]:= 
Transpose @ {#1, Prepend[Differences[#2], 0]}& @@ Transpose@data

注意 ... #1 ... #2 ... &构造是一个纯函数:

http://reference.wolfram.com/mathematica/ref/Function.html
f@x语法只是 f[x]的简写。

最后, f@@listApply[f, list]的简写:

http://reference.wolfram.com/mathematica/ref/Apply.html

因此,如上定义的taildiffs只是其简洁(也许是隐秘的)版本:
Apply[Transpose[Function[{x,y}, {x, Prepend[Differences[y],0]}], Transpose[data]]

关于list - 如何在Mathematica中使用函数式编程减去列表中的特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3106501/

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