内存和计算 使用重复元素高效创建数组



我试图找到一种有效的方法来创建新数组,方法是将旧数组的每个元素重复不同的指定次数。 我想出了一些有用的东西,使用数组推导,但它在内存或计算方面都不是很有效:

LENGTH = 1e6
A = collect(1:LENGTH) ## arbitrary values that will be repeated specified numbers of times
NumRepeats = [rand(20:100) for idx = 1:LENGTH]  ## arbitrary numbers of times to repeat each value in A
B = vcat([ [A[idx] for n = 1:NumRepeats[idx]] for idx = 1:length(A) ]...)

理想情况下,我想要的是一个类似于 Julia 拥有的稀疏矩阵设备的结构,但它会根据出现重复值的索引有效地存储数据。 除此之外,我至少想要一种有效的方法来创建像上面示例中的 B 这样的向量。 我研究了repeat()函数,但据我从文档和我对函数的实验中可以看出,它只是为了为每个切片重复相同次数的数组切片。 解决这个问题的最佳方法是什么?

听起来你正在寻找运行长度编码。这里有一个RLEVectors.jl包:https://github.com/phaverty/RLEVectors.jl。不确定它的可用性如何。您还可以相当轻松地创建自己的数据类型。

感谢您尝试RLEVectors.jl。一些功能和优化一直在主上运行,没有版本颠簸。它绝对可以与其他向量混合用于逐元素算术。我将线性代数运算放在功能请求列表中。欢迎任何其他功能建议。RLEVectors.jl 有一个rep函数,它的工作原理类似于 R,RLEVectors.inverse_ree 就像 StatsBase.inverse_rle,但它适用于运行端而不是长度。

最新更新