如何在 Julia 中将多维数组解压为变量
How to unpack multdimensional array into variables in Julia
在Python我能做到:
a = array([[1,2],[3,4]])
row1, row2 = a
Julia 中是否有等效的单行代码?这似乎不起作用:
a = [[1 2]; [3 4]]
row1, row2 = a
而是设置 row1=1 和 row2=3。谢谢!
Julia 中的数组更通用一些(它们可以不仅仅是二维矩阵)。所以 "rows" 的含义不太清楚,并且可能有更多的选择来切片程序员想要的数组。因此需要在表达式中加入更多信息。
我想出的版本是:
row1, row2 = ([vec(a[i,:]) for i in 1:size(a,1)]...)
解释:
([ ]...)
从向量中创建一个元组
size(a,2)
returns行数
vec( )
将数组转换为向量,因为索引矩阵是矩阵。
[ <...> for i in <...>]
是一个数组理解(Python 也有)
row1, row2 = <...tuple...>
解压元组并为变量赋值。
像Julia和Python这样的通用语言都是图灵完备的,所以什么都可以做,但是没必要期望代码太相似。希望 Julia 方式是更好的方式。
我能想到的 Julia 中最短的一行代码是
r1, r2 = [sub(a, i, :) for i=1:2]
效率不如写出来
r1 = sub(a, 1, :)
r2 = sub(a, 2, :)
因为第一个版本创建了一个临时数组,然后将其解压到左侧的元组中。
注:
新版本的 NumPy(1.10 左右)现在 returns 数组视图,而不是副本。在 Julia 0.4 中,视图是通过 sub 创建的,副本是通过切片创建的。所以在 Julia
r1 = a[1,:]
不等同于类似的NumPy/Python语句
r1 = a[0,:]
视图和副本之间的主要区别在于,如果 r1 是视图,则更改 a 的条目将更改 r1 的条目,但如果 r1 是副本,则不会。副本的缺点是比较占内存
根据您的操作,您可以使用 Vector{Vector{T}}
,例如 python 列表列表而不是 Matrix
(Array{T,2}
)。
在 v0.5+
中正常工作,[ , ]
:
julia> VERSION
v"0.5.0-dev+4440"
julia> a = [[1, 2], [3, 4]]
2-element Array{Array{Int64,1},1}:
[1, 2]
[3, 4]
julia> a = [[1, 2]; [3, 4]]
4-element Array{Int64,1}:
1
2
3
4
julia> row1, row2 = a;
julia> (row1, row2)
(2-element Array{Int64,1}:
1
2,2-element Array{Int64,1}:
3
4)
在 v0.4+
中,您需要将数组键入为数组的数组,如下所示:
julia> VERSION
v"0.4.5"
julia> a = Vector[[1, 2], [3, 4]]
2-element Array{Array{T,1},1}:
[1,2]
[3,4]
julia> b = [[1, 2]; [3, 4]]
4-element Array{Int64,1}:
1
2
3
4
julia> c = [[1, 2], [3, 4]]
WARNING: [a,b] concatenation is deprecated; use [a;b] instead
in depwarn at deprecated.jl:73
in oldstyle_vcat_warning at abstractarray.jl:29
in vect at abstractarray.jl:32
while loading no file, in expression starting on line 0
4-element Array{Int64,1}:
1
2
3
4
julia> row1, row2 = a;
julia> row1, row2
([1,2],[3,4])
在Python我能做到:
a = array([[1,2],[3,4]])
row1, row2 = a
Julia 中是否有等效的单行代码?这似乎不起作用:
a = [[1 2]; [3 4]]
row1, row2 = a
而是设置 row1=1 和 row2=3。谢谢!
Julia 中的数组更通用一些(它们可以不仅仅是二维矩阵)。所以 "rows" 的含义不太清楚,并且可能有更多的选择来切片程序员想要的数组。因此需要在表达式中加入更多信息。
我想出的版本是:
row1, row2 = ([vec(a[i,:]) for i in 1:size(a,1)]...)
解释:
([ ]...)
从向量中创建一个元组size(a,2)
returns行数vec( )
将数组转换为向量,因为索引矩阵是矩阵。[ <...> for i in <...>]
是一个数组理解(Python 也有)row1, row2 = <...tuple...>
解压元组并为变量赋值。
像Julia和Python这样的通用语言都是图灵完备的,所以什么都可以做,但是没必要期望代码太相似。希望 Julia 方式是更好的方式。
我能想到的 Julia 中最短的一行代码是
r1, r2 = [sub(a, i, :) for i=1:2]
效率不如写出来
r1 = sub(a, 1, :)
r2 = sub(a, 2, :)
因为第一个版本创建了一个临时数组,然后将其解压到左侧的元组中。
注:
新版本的 NumPy(1.10 左右)现在 returns 数组视图,而不是副本。在 Julia 0.4 中,视图是通过 sub 创建的,副本是通过切片创建的。所以在 Julia
r1 = a[1,:]
不等同于类似的NumPy/Python语句
r1 = a[0,:]
视图和副本之间的主要区别在于,如果 r1 是视图,则更改 a 的条目将更改 r1 的条目,但如果 r1 是副本,则不会。副本的缺点是比较占内存
根据您的操作,您可以使用 Vector{Vector{T}}
,例如 python 列表列表而不是 Matrix
(Array{T,2}
)。
在 v0.5+
中正常工作,[ , ]
:
julia> VERSION
v"0.5.0-dev+4440"
julia> a = [[1, 2], [3, 4]]
2-element Array{Array{Int64,1},1}:
[1, 2]
[3, 4]
julia> a = [[1, 2]; [3, 4]]
4-element Array{Int64,1}:
1
2
3
4
julia> row1, row2 = a;
julia> (row1, row2)
(2-element Array{Int64,1}:
1
2,2-element Array{Int64,1}:
3
4)
在 v0.4+
中,您需要将数组键入为数组的数组,如下所示:
julia> VERSION
v"0.4.5"
julia> a = Vector[[1, 2], [3, 4]]
2-element Array{Array{T,1},1}:
[1,2]
[3,4]
julia> b = [[1, 2]; [3, 4]]
4-element Array{Int64,1}:
1
2
3
4
julia> c = [[1, 2], [3, 4]]
WARNING: [a,b] concatenation is deprecated; use [a;b] instead
in depwarn at deprecated.jl:73
in oldstyle_vcat_warning at abstractarray.jl:29
in vect at abstractarray.jl:32
while loading no file, in expression starting on line 0
4-element Array{Int64,1}:
1
2
3
4
julia> row1, row2 = a;
julia> row1, row2
([1,2],[3,4])