如何在 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])