Arrays python等价列表的Julia方法

Arrays python等价列表的Julia方法,arrays,julia,Arrays,Julia,我刚开始和茱莉亚修修补补,我真的开始喜欢它了。然而,我遇到了一个路障。例如,在Python中(虽然不是非常高效或pythonic),我会创建一个空列表并附加一个已知大小和类型的列表,然后转换为NumPy数组: Python代码片段 a=[] 对于 a、 附加([1,2,3,4.])) b=numpy.数组(a) 我想在茱莉亚身上做些类似的事情,但我似乎想不出来。这就是我到目前为止所做的: 朱莉娅片段 结果是一个大小为(n,)的n元素数组{Array{Float64,n},1},但我希望它是一个

我刚开始和茱莉亚修修补补,我真的开始喜欢它了。然而,我遇到了一个路障。例如,在Python中(虽然不是非常高效或pythonic),我会创建一个空列表并附加一个已知大小和类型的列表,然后转换为NumPy数组:

Python代码片段
a=[]
对于
a、 附加([1,2,3,4.]))
b=numpy.数组(a)
我想在茱莉亚身上做些类似的事情,但我似乎想不出来。这就是我到目前为止所做的:

朱莉娅片段 结果是一个大小为(n,)的n元素
数组{Array{Float64,n},1}
,但我希望它是一个nx4
数组{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
但这不是朱莉娅的自然模式,你会这样做

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]

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

如果事先不知道循环迭代的次数,或者假设正在合并的底层数组是一维的,则其他答案不起作用。Julia似乎缺少一个内置函数“获取这个N-D数组列表并返回一个新的(N+1)-D数组”

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

下面是一个助手函数,它模拟了此用例的
np.array
功能。(我称它为
collapse
而不是
array
,因为它的行为方式与
np.array
不同。)

人们会把它当作

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

可能重复感谢您的输入,使用hcat/vcat就可以做到这一点。一次性分配所有内存的问题是,我不知道第一维度的长度是多少;它将根据特定条件生长。这也有效!主要的焦点是试图在第一维度构建一个长度未知的数组;假设事先不知道这一点。数组的第一个维度将根据条件语句增长。对于被追加的单个数组是ND(而不是1D),而我们不知道N的情况,有没有办法做到这一点?问题是Julia似乎缺少一个通用的“将列表列表转换为ND数组”函数。因此,例如,如果阵列是二维的,我们需要在最后使用
cat(a,dims=3)
,如果阵列是三维的,我们需要使用
cat(a,dims=4)
。如果您只是尝试使用
hcat(a)
它总是会将结构向下折叠为2D,忽略
cat
dims
参数是一个错误。我能看到的唯一解决方案是使用
a=cat(a..,dims=length(size(a[1]))+1)
,不太好。
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)