朱莉娅:向空向量添加元素

50

我想在Julia中创建一个空向量并将一个数组附加到它上面。我该怎么做?

x = Vector{Float64}
append!(x, rand(10))

导致

`append!` has no method matching append!(::Type{Array{Float64,1}}, ::Array{Float64,1})

谢谢。

4个回答

56

你的变量x并不是一个数组,而是一个类型。

x = Vector{Float64}
typeof(x)  # DataType

你可以通过 Array(Float64, n) 创建一个数组(但要注意,它是未初始化的:包含任意值)或者使用 zeros(Float64, n),其中 n 是所需大小。

由于默认情况下为 Float64,因此我们可以省略它。你的示例变为:

x = zeros(0)
append!( x, rand(10) )

你如何将其扩展到二维数组?例如,我有一些类型为Array{Float64,2}的数字,我想将它们附加到相同类型的空数组中,但是我得到了错误“ERROR:MethodError:'append!'没有匹配的方法append!(::Array {Float64,2},::Array {Float64,2})”。 - lara

48

我对Julia还比较陌生,在遇到类似错误后看到了这个问题。为了回答关于Julia版本1.2.0的原始问题,唯一缺少的是()

x = Vector{Float64}()
append!(x, rand(10))

这个解决方案(不同于x=zeros(0))也适用于其他数据类型。例如,要创建一个存储字典的空向量,请使用:

这种方法可适用于多种数据类型,与x=zeros(0)不同。例如,要创建一个空向量以存储字典,请使用:

d = Vector{Dict}()
push!(d, Dict("a"=>1, "b"=>2))

关于使用push!append!的说明:

根据Julia的帮助文档,push!用于将单个项添加到集合中,而append!则用于将一组项添加到集合中。因此,以下代码片段创建了相同的数组:

逐个添加项:

a = Vector{Float64}()
push!(a, 1.0)
push!(a, 2.0)

附加数组中包含的项:

a = Vector{Float64}()
append!(a, [1.0, 2.0])

谢谢你的回答!确实是append!和push!之间的区别让我困扰 :) - Aerinmund Fagelson

15

你可以通过在[]前输入类型来初始化任何类型的空Vector。例如:

Float64[] # Returns what you want
Array{Float64, 2}[] # Vector of Array{Float64,2}
Any[] # Can contain anything

8

针对 Julia 1 的新答案,append! 已经被弃用了,现在需要使用 push!(array, element) 来向数组中添加元素。

my_stuff = zeros()
push!(my_stuff, "new element")

运行您的代码示例会导致错误:julia> my_stuff = zeros(); push!(my_stuff, "new element") ERROR: MethodError: no method matching push!(::Array{Float64,0}, ::String) Closest candidates are: push!(::Any, ::Any, ::Any) at abstractarray.jl:2064 push!(::Any, ::Any, ::Any, ::Any...) at abstractarray.jl:2065 push!(::Array{Any,1}, ::Any) at array.jl:862 ... Stacktrace: [1] top-level scope at none:0 - Evgeny
@Evgeny,你正在使用Julia 1.0吗?我不确定这个程序在其他版本上是否能够正常运行,特别是早期版本。 - chasmani
你自己试过运行代码了吗?zeros()创建的是一个浮点类型的数组,而你却试图将字符串添加到浮点数中。我的版本是1.1.1,你可以在这里的代码在线上看到错误。 - Evgeny

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