这源于一个相关的讨论,如何使用Mathematica中的函数编程减去列表中的特定元素?
如何轻松计算列表中值之间的百分比差异?
链接的问题使用差异来轻松计算列表中连续元素之间的绝对差异.无论内置的差异函数容易出现这个特殊问题,它仍然存在如何执行不同操作的问题.
正如我之前提到的,我现在希望计算百分比差异.给定一个元素列表{value1, value2, ..., valueN}
,如何执行类似于(value2-value1)/value1
所述列表的操作?
我已经尝试找到一种方法来使用Slot
或SlotSequence
隔离特定元素,然后将自定义函数应用于它们.这是做这样事情的最有效方式(假设有一种方法可以隔离元素并对它们执行操作)?
在 1d 中,我可以使用以下任一方法:
[i for i in 1:5]
Run Code Online (Sandbox Code Playgroud)
或者
map(1:5) do i
i
end
Run Code Online (Sandbox Code Playgroud)
两者都产生
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
有没有办法map
在更高维度上使用?例如复制
[x + y for x in 1:5,y in 10:13]
Run Code Online (Sandbox Code Playgroud)
产生
5×4 Array{Int64,2}:
11 12 13 14
12 13 14 15
13 14 15 16
14 15 16 17
15 16 17 18
Run Code Online (Sandbox Code Playgroud) 我什么时候应该在两个元素的元组上使用 Pair ,反之亦然?
如果我有一个大型结构体,我想创建一个数组(例如稍后创建一个StructArray
),那么当我有关键字默认值时,如何创建一个结构体数组。
例如
Base.@kwdef struct MyType
a = 0
b = 0
c = 0
d = 0
... # can be up to 10 or 20 fields
end
Run Code Online (Sandbox Code Playgroud)
Base.@kwdef
很好,因为我可以使用创建对象MyType(b=10,e=5)
,但有时我有参数数组。我希望能够广播或简洁地构造一个结构数组。
也就是说,我希望以下内容创建一个由三个组成的数组MyType
:MyType.(c=[5,6,7],d = [1,2,3])
相反,它创建单个MyType
wherec
和d
are 数组而不是标量值。
Base.@kwdef
有哪些方法可以保持结构体构造的便利性和简单性?
在尝试扩展Lazy.jl 中的一个示例时,我遇到了评估不是惰性的问题。
在README
使用这个例子:
> esquares = @>> Lazy.range() map(x->x^2) filter(iseven);
> esquares[99]
39204
Run Code Online (Sandbox Code Playgroud)
我试图通过允许将过滤器指定为参数来使其动态化,但它最终评估了一个无限列表:
> squares(filt) = @lazy @>> Lazy.range() map(x->x^2) filter(filt);
> squares(iseven)
(4 16 36 64 100 144 196 256 324 400 484 576 676 ... # this keeps printing until interrupting...)
Run Code Online (Sandbox Code Playgroud)
我也试过:
> @lazy squares(iseven)
(4 16 36 64 100 144 196 256 324 400 484 576 676 ... # this also immediately returns the infinite list
Run Code Online (Sandbox Code Playgroud) 我有一个包含许多参数的模型,我将它们作为命名元组传递。有没有办法将值提升到我的函数中的变量范围?
\nparameters = (\n \xcf\x84\xe2\x82\x81 = 0.035, \n \xce\xb2\xe2\x82\x81 = 0.00509, \n \xce\xb8 = 1,\n \xcf\x84\xe2\x82\x82 = 0.01, \n \xce\xb2\xe2\x82\x82 = 0.02685,\n ... \n)\n
Run Code Online (Sandbox Code Playgroud)\n然后像现在这样使用:
\nfunction model(init,params) # params would be the parameters above\n foo = params.\xce\xb2\xe2\x82\x81 ^ params.\xce\xb8 \nend\n
Run Code Online (Sandbox Code Playgroud)\n有没有办法(marco?)直接将参数放入我的变量范围,以便我可以执行此操作:
\nfunction model(init,params) # params would be the parameters above\n @promote params # hypothetical macro to bring each named tuple field into scope\n foo = \xce\xb2\xe2\x82\x81 ^ \xce\xb8 \nend\n
Run Code Online (Sandbox Code Playgroud)\n后者通过一些数学密集型代码看起来要好得多。
\n使用 Julia 的 Test 包,如何创建@testset
在运行时引用值的 s?
例如我有
test_data = [
(model="a",datapath="models/a.json"),
(model="b",datapath="models/b.json"),
...
]
Run Code Online (Sandbox Code Playgroud)
我想这样做:
@testset "models" begin
for test in test_data
@testset test.model begin
# test range of values/functions here
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是我收到这样的错误,我认为这是因为我试图在运行时定义测试集名称。
ERROR: LoadError: LoadError: LoadError: Unexpected argument test.model to @testset
Stacktrace:
[1] error(::String) at .\error.jl:33
[2] parse_testset_args(::Tuple{Expr}) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.5\Test\src\Test.jl:1244
[3] testset_beginend(::Tuple{Expr,Expr}, ::Expr, ::LineNumberNode) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.5\Test\src\Test.jl:1087
[4] @testset(::LineNumberNode, ::Module, ::Vararg{Any,N} where N) at D:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.5\Test\src\Test.jl:1079
[5] include(::String) at .\client.jl:457
[6] top-level scope at C:\MyPackage\runtests.jl:7
[7] include(::String) …
Run Code Online (Sandbox Code Playgroud) How can I concatenate arrays of different size with a "filler" value where the arrays don't line up?
a = [1,2,3]
b = [1,2]
Run Code Online (Sandbox Code Playgroud)
And I would like:
[1 2 3
1 2 missing]
Run Code Online (Sandbox Code Playgroud)
Or
[1 2 3
1 2 nothing]
Run Code Online (Sandbox Code Playgroud) 您可以使用以下方法迭代列:
for c in eachcol(dataframe)
...
end
Run Code Online (Sandbox Code Playgroud)
其中c
是该列中值的向量。
如何迭代并获取列的名称和该列中的值?
当迭代 a 时GroupedDataFrame
,如何获取组的名称/键?
例如,访问a
每个组的相等值:
df = DataFrame(a=repeat([1, 2, 3, 4], outer=[2]),
b=repeat([2, 1], outer=[4]),
c=1:8);
gd = groupby(df, :a)
for g in gd
#... do something with the dataframe and the key of the dataframe
end
Run Code Online (Sandbox Code Playgroud)