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)
,等等。 cat
的 dims
参数不是可选的,并且没有默认值来指示“最后的维度”。
这是一个辅助函数,它模仿了此用例的 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)
我刚开始研究 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)
,等等。 cat
的 dims
参数不是可选的,并且没有默认值来指示“最后的维度”。
这是一个辅助函数,它模仿了此用例的 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)