【发布时间】: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 中的相应元素给出。有什么想法吗?
【问题讨论】:
我正在寻找一种惯用且紧凑的方式来在 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 中的相应元素给出。有什么想法吗?
【问题讨论】:
# 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 存储库上打开问题,以获取有关要实现的功能的建议、我应该知道的在其他包中实现的功能、与其他语言不匹配的语法,或者是否有任何其他问题。如果您实现这样的任何功能,也可以随时提出拉取请求。如果您需要帮助,请不要害怕使用基本功能提出拉取请求,我可以为您提供帮助。
【讨论】:
这是使用数组推导的一种选择:
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)。
【讨论】: