gpt4 book ai didi

arrays - 两种不同类型的数组数组

转载 作者:行者123 更新时间:2023-12-03 20:01:43 25 4
gpt4 key购买 nike

我对不同类型的数组数组感到困惑。考虑这两个例子

a = Array{Float64}[]
push!(a,[1, 2])
push!(a,[3, 4])
push!(a,[1 2; 3 4])

b = Array[[1.0, 2.0], [3.0,4.0], [1.0 2.0; 3.0 4.0]]

我不确定如何 ab不同。假设我打算对 a 中的每个元素运行一个 for 循环。或 b , 并将每个元素乘以 2。也就是说,
for i in 1:3 a[i] = a[i]*2 end

for i in 1:3 b[i] = b[i]*2 end
我分别为两条线的运行时间计时,但它们同样快。是 ab相同?如果是这样,为什么 a甚至存在?看起来相当复杂,因为 typeof(a)产生“Array{Array{Float64,N} where N,1}”。什么 where在这里做什么?

最佳答案

两者 ab是向量,但它们允许不同类型的元素。你可以通过写来检查这一点:

julia> typeof(a)
Array{Array{Float64,N} where N,1}

julia> typeof(b)
Array{Array,1}
现在 Array ISA parametric type取两个参数。第一个参数是它允许的元素类型。第二个参数是维度。您可以看到,在这两种情况下,维度都是 1这意味着两者 ab是向量。您也可以使用 ndims 检查它功能:
julia> ndims(a)
1

julia> ndims(b)
1
第一个参数是允许的元素类型。在 a的情况下它是 Array{Float64,N} where N而在 b 的情况下只是 Array被打印。在我解释如何阅读它们之前,请注意第一个参数可以使用 eltype 提取。功能:
julia> eltype(a)
Array{Float64,N} where N

julia> eltype(b)
Array
你可以看到 ab允许 Array存储。首先让我解释如何阅读 Array{Float64, N} where N .这意味着 a允许存储 Float64 的数组任何维度。实际上你可以用更短的方式写成这样 Array{Float64}你可以检查一下:
julia> (Array{Float64,N} where N) === Array{Float64}
true
原因是如果您不对尾部参数设置限制,则可以在语法中删除它。 where N部分是对参数的限制。在这种情况下,对第二个参数没有限制。
现在我们可以求助于 b .你看它的 eltype只是 Array , 所以 两者 参数被删除,因此对它们没有如上所述的限制。所以 ArrayArray{T, N} where {T,N} 相同正如你在这里看到的:
julia> (Array{T, N} where {T,N}) === Array
true
所以区别在于 a可以存储任何维度的数组,但它们必须有 Float64元素类型,而 b可以存储任何维度和任何元素类型的数组。在这种情况下,这种区别对性能没有影响,但会影响 a 中可以存储的内容。和 b .这里有些例子。
在这种情况下,它们的工作方式相同,就像您尝试存储 Int 一样。在它们中,但它们只允许数组:
julia> a[1] = 1
ERROR: MethodError: Cannot `convert` an object of type

julia> b[1] = 1
ERROR: MethodError: Cannot `convert` an object of type
但在这里他们有所不同:
julia> a[1] = ["a"]
ERROR: MethodError: Cannot `convert` an object of type String to an object of type Float64

julia> b[1] = ["a"]
1-element Array{String,1}:
"a"

julia> a
3-element Array{Array{Float64,N} where N,1}:
[1.0, 2.0]
[3.0, 4.0]
[1.0 2.0; 3.0 4.0]

julia> b
3-element Array{Array,1}:
["a"]
[3.0, 4.0]
[1.0 2.0; 3.0 4.0]
如您所见,您可以存储一个数组 Stringb ,但这不允许存储在 a 中.
两个额外的评论(两个主题都有点复杂,所以我省略了细节,但只是给你提示正在发生的事情):
  • 定义数组时可以不指定数组的元素类型。在这种情况下,Julia 将自动选择其元素类型:
  • julia> [[1.0, 2.0], [3.0,4.0], [1.0 2.0; 3.0 4.0]]
    3-element Array{Array{Float64,N} where N,1}:
    [1.0, 2.0]
    [3.0, 4.0]
    [1.0 2.0; 3.0 4.0]
  • 数组元素类型选择对性能的影响取决于以下事实:
  • 如果类型是抽象的(可以通过 isabstracttype 检查;这会影响编译器做出的类型推断),
  • 如果是位类型(可以通过 isbitstype 检查;这会影响存储布局),
  • 如果元素类型是 Union (可以更有效地处理小型工会)。


  • 在您的情况下,两种元素类型都是抽象的和非位的,因此性能是相同的。

    关于arrays - 两种不同类型的数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65866816/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com