在Julia中初始化一个数组的数组

31
我试图创建一个由两个数组组成的数组。但是,a = [[1, 2], [3, 4]] 并不能实现这一点,它实际上只是将这些数组连接起来。在 Julia 中也是如此:[[1, 2], [3, 4]] == [1, 2, 3, 4] 。你有什么想法吗?
作为临时解决办法,我使用了 push!(push!(Array{Int, 1}[], a), b)
7个回答

24

如果你想要一个数组的数组而不是一个矩阵(即二维Array):

a = Array[ [1,2], [3,4] ]
您可以通过在[]前面放置类型来参数化(指定元素类型)Array文本。因此,在此处,我们使用Array类型参数化Array字面量。这会更改字面声明中括号的解释。

15

Sean Mackesey的答案会给你一个类型为Array{Array{T,N},1}的对象(如果你在[]前面加上类型,它也可以是Array{Array{Int64,N},1})。如果你想要一个更强类型化的东西,例如整数向量的向量(即Array{Array{Int64,1},1}),请使用以下方法:

a = Vector{Int}[ [1,2], [3,4] ]

15
在 Julia v0.5 中,原始语法现在能够产生所需的结果:
julia> a = [[1, 2], [3, 4]]
2-element Array{Array{Int64,1},1}:
 [1,2]
 [3,4]

julia> VERSION
v"0.5.0"

11

关于构建 Array 类型的数组的一般性答案:

在 Julia 中,您可以拥有一个包含其他 Array 类型对象的数组。考虑以下初始化各种类型的数组的示例:

A = Array{Float64}(10,10)  # A single Array, dimensions 10 by 10, of Float64 type objects

B = Array{Array}(10,10,10)  # A 10 by 10 by 10 Array.  Each element is an Array of unspecified type and dimension.

C = Array{Array{Float64}}(10)  ## A length 10, one-dimensional Array.  Each element is an Array of Float64 type objects but unspecified dimensions

D = Array{Array{Float64, 2}}(10)  ## A length 10, one-dimensional Array.  Each element of is an 2 dimensional array of Float 64 objects

比如说,考虑一下C和D之间的区别:

julia> C[1] = rand(3)
3-element Array{Float64,1}:
 0.604771
 0.985604
 0.166444

julia> D[1] = rand(3)
ERROR: MethodError: 

rand(3)生成的对象类型为Array{Float64,1}。由于对C元素的唯一规定是它们必须是由浮点类型组成的数组,因此这符合C的定义。但是,对于D,我们规定元素必须是二维数组。因此,由于rand(3)不产生二维数组,我们不能使用它来为D的特定元素赋值。

指定数组内数组的具体维度

虽然我们可以指定一个数组将保存元素类型为数组,我们可以指定那些元素应该是二维数组等,但是我们无法直接指定这些元素的维度。例如,我们无法直接指定要保存10个数组的数组,其中每个数组都是5x5的。我们可以从用于构造数组的Array()函数的语法中看到这一点:

Array {T}(dims)

构造一个未初始化的密集数组,其元素类型为 T。dims 可以是元组或一系列整数参数。数组的语法 Array(T,dims) 也可用,但已弃用。

在Julia中,数组的类型包括维度数量,但不包括这些维度的大小。因此,在这个语法中没有地方可以指定精确的维度。尽管如此,可以使用类似的数组推导式达到类似的效果:

E = [Array{Float64}(5,5) for idx in 1:10]

2
julia> C = Array{Array{Float64}}(10) 错误:方法错误:没有匹配的方法Array {Array {Float64,N} where N,N} where N(:: Int64) 最接近的候选人是: Array {Array {Float64,N} where N,N} where N(:: UndefInitializer,:: Int64)where T at boot.jl:408 Array {Array {Float64,N} where N,N} where N(:: UndefInitializer,:: Int64,:: Int64)where T at boot.jl:409 Array {Array {Float64,N} where N,N} where N(:: UndefInitializer,:: Int64,:: Int64,:: Int64)where T at boot.jl:410 ... - xji

4

对于那些想知道的人,在v0.7中,这相当类似:

Array{Array{Float64,1},2}(undef, 10,10)  #creates a two-dimensional array, ten rows and ten columns where each element is an array of type Float64

Array{Array{Float64, 2},1}(undef,10) #creates a one-dimensional array of length ten, where each element is a two-dimensional array of type Float64

2
您可能需要一个矩阵:
julia> a = [1 2; 3 4]
2x2 Int64 Array:
 1  2
 3  4

也许是一个元组:
julia> a = ([1,2],[3,4,5])
([1,2],[3,4,5])

2

您还可以使用{[1,2],[3,4]}创建一个Array{Any,1},其中包含[1,2][3,4],而不是Array{Array{T,N},1}


我以为 {} 是用于映射的,但是我已经尝试过了,发现它确实像你说的那样工作。这里的情况比我意识到的要复杂得多! - Benjohn
{...} 在 Julia v0.4 中已被弃用。 - David P. Sanders
@DavidP.Sanders 那个语法被替换成了什么? - PythonNut
在未来(希望是v0.5),它将成为您想要编写的内容,即向量的向量,例如[[1, 2],[3, 4]]。 (在Julia v0.3中,该语法将这两个数组连接为具有4个元素的单个数组。在v0.4中也已弃用。现在使用“;”进行连接:[[1, 2]; [3, 4]]会得到[1, 2, 3, 4]。) - David P. Sanders
1
目前最好的选择是 Vector{Int}[[1, 2], [3,4]] - David P. Sanders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接