Разница между массивом и вектором - PullRequest
5 голосов
/ 12 апреля 2020

Есть ли разница между Array и Vector?

typeof(Array([1,2,3]))
Vector{Int64}

typeof(Vector([1,2,3]))
Vector{Int64}

Кажется, что оба создают одно и то же, но они не одинаковы:

Array == Vector
false

Array === Vector
false

Так какая разница на самом деле?

Ответы [ 2 ]

7 голосов
/ 12 апреля 2020

Разница в том, что Vector является одномерным Array, поэтому при написании, например, Vector{Int} это сокращение от Array{Int, 1}:

julia> Vector{Int}
Array{Int64,1}

Когда вы вызываете конструкторы Array([1,2,3]) и Vector([1,2,3]) они внутренне переводятся на тот же вызов Array{Int,1}([1,2,3]), как вы передали им вектор.

Вы увидите разницу, если захотите передать массив, который не является одномерным:

julia> Array(ones(2,2))
2×2 Array{Float64,2}:
 1.0  1.0
 1.0  1.0

julia> Vector(ones(2,2))
ERROR: MethodError: no method matching Array{T,1} where T(::Array{Float64,2})

Также обратите внимание на эффект:

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

julia> Vector(x)
3-element Array{Int64,1}:
 1
 2
 3

julia> Vector(x) === x
false

Таким образом, по сути, вызов Vector(x) делает копию x. Обычно в коде вы, вероятно, просто пишете copy(x).

. Общее правило состоит в том, что Array - это тип параметров c, в котором два параметра заданы в фигурных скобках:

  • первый тип элемента (вы можете получить к нему доступ с помощью eltype)
  • второй - размер массива (вы можете получить к нему доступ с помощью ndims)

Подробнее см. https://docs.julialang.org/en/v1/manual/arrays/.

3 голосов
/ 12 апреля 2020

Vector - псевдоним для одномерного Array. Вы можете видеть, что в Julia REPL:

julia> Vector
Array{T, 1} where T

julia> Vector{Int32}
Array{Int32, 1}

Аналогично, Matrix - это двумерный массив:

julia> Matrix
Array{T,2} where T
...