【问题标题】:Julia - equivalent of R's rep() with times argumentJulia - 相当于 R 的 rep() 和 times 参数
【发布时间】:2016-07-18 11:38:55
【问题描述】:

我正在寻找一种惯用且紧凑的方式来在 Julia 中实现我在 R 中所做的事情

v1=1:5;v2=5:1;out=rep(v1,times=v2);out
# 1 1 1 1 1 2 2 2 2 3 3 3 4 4 5

即复制向量v1 中的每个元素的次数由向量v2 中的相应元素给出。有什么想法吗?

【问题讨论】:

    标签: vector julia


    【解决方案1】:

    尝试使用VectorizedRoutines.jl

    # Pkg.clone("https://github.com/ChrisRackauckas/VectorizedRoutines.jl")
    # Will be Pkg.add("VectorizedRoutines") after being added to package system
    using VectorizedRoutines
    v1=1:5
    v2 = 5:-1:1
    R.rep(v1,each = v2)
    

    该实现基于 RLEVectors.jl,通过 aireties 的建议(稍微改进了输入,因此您不必收集)。

    这是我开始使用的一个包,用于收集来自 R/MATLAB/Python 的所有矢量化例程,以便更轻松地将函数(和想法)移植到 Julia。随意在 Github 存储库上打开问题,以获取有关要实现的功能的建议、我应该知道的在其他包中实现的功能、与其他语言不匹配的语法,或者是否有任何其他问题。如果您实现这样的任何功能,也可以随时提出拉取请求。如果您需要帮助,请不要害怕使用基本功能提出拉取请求,我可以为您提供帮助。

    【讨论】:

    • 非常感谢 - 这确实更快,内存效率更高!
    • 如果您有时间,您是否还介意快速浏览一下codereview.stackexchange.com/questions/134926/… - 我在那里做了一个 R 到 Julia 端口的一个小示例程序,但我在 Julia 中的基准测试结果很差 - 你可能会马上告诉我我做错了什么?
    【解决方案2】:

    这是使用数组推导的一种选择:

    v1 = 1:5;
    v2 = 5:-1:1;
    
    out = vcat([ [v1[idx] for n = 1:v2[idx]] for idx = 1:length(v1) ]...)
    

    另外,如果你想要更接近 R 语法的东西,你可以使用 RLEVectors 包中的rep() 函数:

    ## Pkg.add("RLEVectors")
    using RLEVectors
    out2 = rep(collect(v1), each = collect(v2))
    

    照原样,out2 将是一个带有游程编码的向量。它的功能与大多数其他向量类似,在某些情况下具有内存和计算加速。但是,如果你想从中得到一个常规向量,只需使用collect(out2)

    【讨论】:

    • 非常感谢 - 非常感谢!只是在这里学习 Julia...
    • @TomWenseleers 当然可以。另请参阅我更新的答案,还有另一个可能更接近您熟悉的 R 语法的选项。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    相关资源
    最近更新 更多