【问题标题】:properly creating arrays of arrays in julia在 julia 中正确创建数组数组
【发布时间】:2019-07-29 20:18:08
【问题描述】:

我想在 julia.xml 中用整数填充一个数组数组。以下作品:

a = Array{Int64}[]
push!(a, [1,2,3])

但这不是:

a = Array{Array{Int64}}[]
push!(a, [1, 2, 3])

错误是:MethodError: Cannot `convert` an object of type Int64 to an object of type Array{Int64,N} where N

有人可以解释为什么吗?似乎Array{Array{Int64}} 应该是数组的类型,其元素是包含 Int64 值的数组,而Array{Int64} 是整数数组。然而a = Array{Int64}[] 似乎初始化了一个包含整数而不是整数数组的数组数组?有人可以澄清这里的逻辑吗?

【问题讨论】:

  • 我相信你想要追加而不是推送。
  • 简单的解释是T[]创建了一个空的Vector{T}。所以Array{Int}[] 创建了一个Vector{Array{T}}。请注意,您应该使用Array{T}。始终改用Vector{T},或者指定维数,如Array{Int, 1}。我的建议:总是使用Vector{T}Matrix{T} 而不是Array{T, 1}Array{T, 2}从不使用Array{T},它会创建一个抽象类型。
  • @DNF 数组的抽象类型是什么意思?文档说Julia provides the Vector and Matrix constructor functions, but these are simply aliases for uninitialized one and two dimensional arrays - Vector 不是Array 的别名吗? [1,2,3] 的默认类型是数组。
  • 是的,Vector{T}Array{T, 1} 的别名,Matrix{T}Array{T,2} 的别名。问题是人们总是忘记指定维度,而是写Array{T}。这是一个抽象类型,因为它是元素类型为T 的所有维度的所有数组的联合。编写VectorMatrix 可确保您不会忘记维度,并使您的代码更具可读性。

标签: arrays julia


【解决方案1】:

a = Array{Int64}[]
push!(a, [1,2,3])

是一个数组向量,在操作之后你有一个包含一个数组的 1 元素向量:

julia> a
1-element Array{Array{Int64,N} where N,1}:
 [1, 2, 3]

julia> a[1]
3-element Array{Int64,1}:
 1
 2
 3

同时:

a = Array{Array{Int64}}[]

为您创建一个数组数组的向量:

julia> a = Array{Array{Int64}}[]
0-element Array{Array{Array{Int64,N} where N,N} where N,1}

因此您可以将push! 放入它的数组数组中,例如:

julia>     push!(a, [[1,2,3]])
1-element Array{Array{Array{Int64,N} where N,N} where N,1}:
 [[1, 2, 3]]

julia> a[1]
1-element Array{Array{Int64,N} where N,1}:
 [1, 2, 3]

julia> a[1][1]
3-element Array{Int64,1}:
 1
 2
 3

【讨论】:

  • 谢谢。你能解释一下这如何转化为函数签名吗? function process_array(s::Array{Array{Array{Int64,1},1},1}) 是正确的说法,该函数采用 int 数组的数组吗?为什么1 维度必须明确存在,而不仅仅是Array{Array{Array{Int64}}}}
  • 我希望@DNF 很好地解释了为什么1 出现在上面(并且您通常应该使用VectorMatrix,除非您需要更高维度的对象)。现在关于签名,如果您编写T[],那么接受此值的函数调用应指定为f(::Vector{T})(因此本质上在函数调用中,您在构造对象时指定的内容之上还有一个额外的Vector)。
猜你喜欢
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2023-03-08
相关资源
最近更新 更多