Julia方法python等效列表列表

时间:2015-02-02 05:22:34

标签: arrays 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}

有任何建议或更好的方法吗?

3 个答案:

答案 0 :(得分:5)

您的代码的字面翻译将是

# 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

但这不是朱莉娅的自然模式,你可以这样做

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]

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

答案 1 :(得分:4)

这样做你想要的吗?

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]])

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

答案 2 :(得分:1)

如果事先不知道循环迭代的次数,或者假设要合并的基础数组是一维的,则其他答案无效。看来Julia缺少“获取此N-D数组列表并返回一个新的(N + 1)-D数组” 的内置函数。

Julia根据基础数据的维度需要不同的串联解决方案。因此,例如,如果a的基础元素是矢量,则可以使用hcat(a)cat(a,dims=2)。但是,如果a例如是2D数组,则必须使用cat(a,dims=3),依此类推。dims的{​​{1}}参数不是可选的,并且没有默认值指示“最后一个维度”。

这是一个辅助函数,它针对此用例模仿了cat功能。 (我将其称为np.array而不是collapse,因为它的行为与array不太相同)

np.array

一个人会以此为

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