Julia 方法 python 列表的等效列表

Julia Approach to python equivalent list of lists

我刚开始研究 Julia,我真的越来越喜欢它了。但是,我 运行 陷入了困境。例如,在 Python 中(虽然不是很高效或 pythonic),我会创建一个空列表并附加一个已知大小和类型的列表,然后转换为 NumPy 数组:

Python 片段

a = []
for ....
    a.append([1.,2.,3.,4.])

b = numpy.array(a)

我希望能够在 Julia 中做类似的事情,但我似乎无法弄清楚。这是我目前所拥有的:

茱莉亚片段

a = Array{Float64}[]
for .....
    push!(a,[1.,2.,3.,4.])
end

结果是大小为 (n,) 的 n 元素 Array{Array{Float64,N},1},但我希望它是 nx4 Array{Float64,2}.

有什么建议或更好的方法吗?

这是你想要的吗?

julia> a = Array{Float64}[]
0-element Array{Array{Float64,N},1}

julia> for i=1:3
           push!(a,[1.,2.,3.,4.])
       end

julia> a
3-element Array{Array{Float64,N},1}:
 [1.0,2.0,3.0,4.0]
 [1.0,2.0,3.0,4.0]
 [1.0,2.0,3.0,4.0]

julia> b = hcat(a...)'
3x4 Array{Float64,2}:
 1.0  2.0  3.0  4.0
 1.0  2.0  3.0  4.0
 1.0  2.0  3.0  4.0

似乎与 python 输出匹配:

In [9]: a = []

In [10]: for i in range(3):
    a.append([1, 2, 3, 4])
   ....:

In [11]: b = numpy.array(a); b
Out[11]:
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])

我应该补充一点,这可能不是您真正想要做的,因为如果 a 有很多元素,hcat(a...)' 可能会很昂贵。有没有理由不从一开始就使用二维数组?也许问题的更多上下文(即您实际尝试编写的代码)会有所帮助。

您的代码直译为

# Building up as rows
a = [1. 2. 3. 4.]
for i in 1:3
    a = vcat(a, [1. 2. 3. 4.])
end

# Building up as columns
b = [1.,2.,3.,4.]
for i in 1:3
    b = hcat(b, [1.,2.,3.,4.])
end

但这不是 Julia 中的自然模式,你会做类似

的事情
A = zeros(4,4)
for i in 1:4, j in 1:4
    A[i,j] = j
end

甚至

A = Float64[j for i in 1:4, j in 1:4]

基本上一次分配所有内存。

如果事先不知道循环迭代次数,或者假设要合并的底层数组是 one-dimensional,则其他答案无效。 Julia 似乎缺少 的 built-in 函数“获取这个 N-D 数组列表和 return 我一个新的 (N+1)-D 数组”.

Julia 需要不同的串联解决方案,具体取决于基础数据的维度。因此,例如,如果 a 的基础元素是向量,则可以使用 hcat(a)cat(a,dims=2)。但是,如果 a 是一个二维数组,则必须使用 cat(a,dims=3),等等。 catdims 参数不是可选的,并且没有默认值来指示“最后的维度”。

这是一个辅助函数,它模仿了此用例的 np.array 功能。 (我称它为 collapse 而不是 array,因为它的行为方式与 np.array 不太一样)

function collapse(x)
    return cat(x...,dims=length(size(x[1]))+1)
end

有人会用这个作为

a = []
for ...
    ... compute new_a...
    push!(a,new_a)
end
a = collapse(a)