如何在Julia中将多维数组解压缩为变量

时间:2016-06-06 12:36:10

标签: python multidimensional-array julia iterable-unpacking

在Python中,我可以这样做:

a = array([[1,2],[3,4]])
row1, row2 = a

朱莉娅是否有相同的单线?这似乎不起作用:

a = [[1 2]; [3 4]]
row1, row2 = a

相反,它设置row1 = 1和row2 = 3。谢谢!

3 个答案:

答案 0 :(得分:3)

我能想到的朱莉亚最短的单线是

r1, r2 = [sub(a, i, :) for i=1:2]

它没有写出来的效率

r1 = sub(a, 1, :)
r2 = sub(a, 2, :)

因为第一个版本创建了一个临时数组,然后将其解压缩到左侧的元组中。

注意:

新版本的NumPy(1.10左右)现在返回数组的视图,而不是副本。在Julia 0.4中,视图由 sub 创建,副本通过切片创建。所以朱莉娅

r1 = a[1,:]

等同于类似的NumPy / Python语句

r1 = a[0,:]

视图和副本之间的主要区别在于,如果r1是视图,则更改a的条目将更改r1的条目,但如果r1是副本则不会。副本的缺点是它们会占用更多内存。

答案 1 :(得分:3)

根据您的操作,您可以使用Vector{Vector{T}},例如python列表列表,而不是MatrixArray{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]) 中,您需要将数组类型化为数组数组,如下所示:

[x if a else b for x in lst]

答案 2 :(得分:2)

Julia中的数组更通用(它们可以超过2-d矩阵)。因此,“行”的含义不太清楚,可能有更多选项来切割程序员打算使用的数组。因此,需要在表达式中添加更多信息。

我提出的版本是:

row1, row2 = ([vec(a[i,:]) for i in 1:size(a,1)]...)

说明:

  • ([ ]...)从向量中创建一个元组
  • size(a,2)返回行数
  • vec( )将数组转换为向量,因为索引矩阵是矩阵。
  • [ <...> for i in <...>]是一个数组理解(Python也有它们)
  • row1, row2 = <...tuple...>解包一个元组并为变量赋值。

所有像Julia和Python这样的通用语言都是图灵完备的,所以一切都可以完成,但是没有必要期望代码太相似了。朱莉娅的方式有望成为更好的方式。