Julia: append to an empty vector

69,123

Solution 1

Your variable x does not contain an array but a type.

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

You can create an array as Array(Float64, n) (but beware, it is uninitialized: it contains arbitrary values) or zeros(Float64, n), where n is the desired size.

Since Float64 is the default, we can leave it out. Your example becomes:

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

Solution 2

I am somewhat new to Julia and came across this question after getting a similar error. To answer the original question for Julia version 1.2.0, all that is missing are ():

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

This solution (unlike x=zeros(0)) works for other data types, too. For example, to create an empty vector to store dictionaries use:

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

A note regarding use of push! and append!:

According to the Julia help, push! is used to add individual items to a collection, while append! adds an collection of items to a collection. So, the following pieces of code create the same array:

Push individual items:

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

Append items contained in an array:

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

Solution 3

You can initialize an empty Vector of any type by typing the type in front of []. Like:

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

Solution 4

New answer, for Julia 1. append! is deprecated, you now need to use push!(array, element) to add elements to an array

my_stuff = zeros()
push!(my_stuff, "new element")
Share:
69,123
Anarcho-Chossid
Author by

Anarcho-Chossid

Updated on July 18, 2022

Comments

  • Anarcho-Chossid
    Anarcho-Chossid over 1 year

    I would like to create an empty vector and append to it an array in Julia. How do I do that?

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

    results in

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

    Thanks.

  • lara
    lara over 7 years
    How do you extend this to a 2D array? For example I have a number of type Array{Float64,2} that I want to append to a blank array of the same type but I'm gettting the error 'ERROR: MethodError: append! has no method matching append!(::Array{Float64,2}, ::Array{Float64,2})'.
  • Evgeny
    Evgeny about 4 years
    Running your code example results in error: 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
  • chasmani
    chasmani about 4 years
    @Evgeny are you on Julia 1.0? I'm not sure this will work the same on other versions, especially earlier versions
  • Evgeny
    Evgeny about 4 years
    did you try running the code yourself? zeros() create an array of type Float and you are trying to add strings to Float. My version is 1.1.1. and you can see the error in code also here online.
  • Aerinmund Fagelson
    Aerinmund Fagelson over 3 years
    Thanks for this answer! It was indeed the difference between append! and push! that was tripping me up :)