【问题标题】:Initialize an array of arrays in Julia在 Julia 中初始化数组
【发布时间】:2013-12-23 00:50:50
【问题描述】:

我正在尝试创建一个包含两个数组的数组。但是,a = [[1, 2], [3, 4]] 并没有这样做,它实际上连接了数组。这在 Julia 中是正确的:[[1, 2], [3, 4]] == [1, 2, 3, 4]。有什么想法吗?

作为临时解决方法,我使用push!(push!(Array{Int, 1}[], a), b)

【问题讨论】:

    标签: julia


    【解决方案1】:

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

    a = Array[ [1,2], [3,4] ]
    

    您可以通过将类型放在[] 前面来参数化(指定元素的类型)Array 文字。所以这里我们用Array 类型参数化Array 文字。这会改变文字声明中括号的解释。

    【讨论】:

      【解决方案2】:

      Sean Mackesey 的答案将为您提供 Array{Array{T,N},1} 类型的内容(或 Array{Array{Int64,N},1},如果您将类型放在 [] 前面)。如果您想要更强烈的类型,例如 Int 的 vectors 向量(即Array{Array{Int64,1},1}),请使用以下内容:

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

      【讨论】:

        【解决方案3】:

        在 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"
        

        【讨论】:

          【解决方案4】:

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

          在 Julia 中,您可以拥有一个包含其他 Array 类型对象的 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 的元素的唯一规范是它们是具有Float64 类型元素的数组,这符合C 的定义。但是,对于D,我们指定元素必须是二维数组。因此,由于rand(3) 不生成二维数组,我们不能使用它为D 的特定元素赋值

          指定数组中数组的特定维度

          虽然我们可以指定一个 Array 将包含 Array 类型的元素,并且我们可以指定它,例如这些元素应该是二维数组,我们不能直接指定这些元素的维度。例如。我们不能直接指定我们想要一个包含 10 个数组的数组,每个数组是 5,5。我们可以从用于构造数组的Array() 函数的语法中看出这一点:

          数组{T}(尺寸)

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

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

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

          【讨论】:

          • julia> C = Array{Array{Float64}}(10) 错误:MethodError:没有方法匹配 Array{Array{Float64,N} where N,N} where N(::Int64) Closest候选者是: 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) 其中 T 在 boot.jl:410 ...
          【解决方案5】:

          对于那些想知道的人,在 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
          

          【讨论】:

            【解决方案6】:

            你可能想要一个矩阵:

            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])
            

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 我认为{} 是用于地图的——但我已经尝试过了,发现它确实如你所说。这里发生的事情比我意识到的要多得多!
              • {...} 在 Julia v0.4 中已被弃用。
              • @DavidP.Sanders 用什么替换了该语法?
              • 在未来(希望是 v0.5)它会是你想要写的,[ [1, 2], [3, 4] ],即向量的向量。 (在 Julia v0.3 中,该语法将两个数组连接成一个包含 4 个元素的数组。这在 v0.4 中也已被弃用。连接现在使用 ";" :[ [1, 2]; [3, 4] ] 给出 [1, 2, 3, 4]。)
              • 目前最好的选择是Vector{Int}[[1, 2], [3,4]]
              猜你喜欢
              • 2018-02-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-11-09
              • 1970-01-01
              相关资源
              最近更新 更多