Julia - 根据向量重塑数组

3

我有一个数组的数组,a

49455-element Array{Array{AbstractString,1},1}

长度可能会有所不同,这只是众多可能性之一。

我需要执行b = vcat(a...)使我得到:

195158-element Array{AbstractString,1}:

将其转换为SharedArray以使所有核心都可以处理其中的字符串(我将在幕后将其转换为Char矩阵,但这不重要)。

在a中,每个元素都是一些字符串的数组,我需要

map(x -> length(x), a)
49455-element Array{Int64,1}:
  1
  4
  8
  .
  .
  2

有没有一种简单的方法可以将数组b恢复为与a相同的维度?
2个回答

3
使用Iterators.jl包:
# `a` holds original. `b` holds flattened version. `newa` should == `a`

using Iterators            # install using Pkg.add("Iterators")
lmap = map(length,a)       # same length vector defined in OP

newa = [b[ib+1:ie] for (ib,ie) in partition([0;cumsum(lmap)],2,1)]

这有点不错,也可以用来生成原始向量的生成器,但是使用for循环实现应该同样快速和清晰。


2
作为对Dan Getz答案的补充,我们也可以使用zip代替Iterators.jl的partition:
tails = cumsum(map(length,a))
heads = [1;tails+1][1:end-1]
newa = [b[i:j] for (i,j) in zip(heads,tails)]

1
你尝试过使用长度大于1的向量吗? - Dan Getz
1
@DanGetz cumsum 就是我正在寻找的。只是午夜太糟糕了 ;) - Gnimuc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接