数组 #

一、数组基础 #

1.1 创建数组 #

使用方括号创建数组:

julia
arr1 = [1, 2, 3, 4, 5]
arr2 = ["a", "b", "c"]
arr3 = [1, 2.0, 3]
arr4 = []

1.2 数组类型 #

julia
typeof([1, 2, 3])
typeof([1.0, 2.0, 3.0])
typeof([1, 2.0, 3])
typeof([])

1.3 指定类型 #

julia
Int[1, 2, 3]
Float64[1, 2, 3]
String["a", "b", "c"]
Any[1, "a", 2.0]

1.4 创建特定大小的数组 #

julia
zeros(5)
zeros(Int, 5)
ones(3)
ones(Float64, 3)
fill(0, 5)
fill("hello", 3)

1.5 未初始化数组 #

julia
Vector{Int}(undef, 5)
Array{Int, 1}(undef, 5)
Matrix{Float64}(undef, 3, 3)

1.6 数组推导 #

julia
[x^2 for x in 1:5]
[x * y for x in 1:3, y in 1:3]
[x for x in 1:10 if x % 2 == 0]

二、数组索引 #

2.1 基本索引 #

Julia数组索引从1开始:

julia
arr = [10, 20, 30, 40, 50]
arr[1]
arr[5]
arr[end]
arr[begin]

2.2 负索引 #

Julia不支持负索引,但可以使用end

julia
arr = [10, 20, 30, 40, 50]
arr[end]
arr[end-1]
arr[end-2]

2.3 越界检查 #

julia
arr = [1, 2, 3]
arr[0]
arr[4]

2.4 安全索引 #

使用getindexget

julia
arr = [1, 2, 3]
getindex(arr, 1)
get(arr, 4, nothing)

三、数组切片 #

3.1 基本切片 #

julia
arr = [1, 2, 3, 4, 5]
arr[1:3]
arr[2:end]
arr[begin:3]
arr[:]

3.2 步长切片 #

julia
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr[1:2:end]
arr[2:2:end]
arr[end:-1:begin]

3.3 视图 #

切片会创建新数组,使用view避免复制:

julia
arr = [1, 2, 3, 4, 5]
v = view(arr, 2:4)
v[1] = 20
arr

使用@view宏:

julia
@view arr[2:4]
@views arr[2:4] .+ 1

四、数组操作 #

4.1 添加元素 #

julia
arr = [1, 2, 3]
push!(arr, 4)
push!(arr, 5, 6)
pushfirst!(arr, 0)
append!(arr, [7, 8, 9])

4.2 删除元素 #

julia
arr = [1, 2, 3, 4, 5]
pop!(arr)
popfirst!(arr)
deleteat!(arr, 2)
splice!(arr, 2)
empty!(arr)

4.3 插入元素 #

julia
arr = [1, 2, 3]
insert!(arr, 2, 10)
splice!(arr, 2, [10, 20, 30])

4.4 修改元素 #

julia
arr = [1, 2, 3, 4, 5]
arr[1] = 10
arr[2:3] = [20, 30]

4.5 数组连接 #

julia
[1, 2, 3] ∪ [3, 4, 5]
vcat([1, 2], [3, 4])
hcat([1, 2], [3, 4])
[[1, 2], [3, 4]]

五、数组信息 #

5.1 大小和长度 #

julia
arr = [1, 2, 3, 4, 5]
length(arr)
size(arr)
ndims(arr)
eltype(arr)
isempty(arr)

5.2 查找元素 #

julia
arr = [1, 2, 3, 2, 4, 2]
findfirst(x -> x == 2, arr)
findlast(x -> x == 2, arr)
findall(x -> x == 2, arr)
findmax(arr)
findmin(arr)

5.3 检查元素 #

julia
arr = [1, 2, 3, 4, 5]
in(3, arr)
3 ∈ arr
3 ∉ arr
any(x -> x > 3, arr)
all(x -> x > 0, arr)

六、数组排序 #

6.1 排序 #

julia
arr = [3, 1, 4, 1, 5, 9, 2, 6]
sort(arr)
sort!(arr)
sort(arr, rev=true)

6.2 排序索引 #

julia
arr = [3, 1, 4, 1, 5, 9, 2, 6]
sortperm(arr)
arr[sortperm(arr)]

6.3 自定义排序 #

julia
arr = ["apple", "banana", "cherry"]
sort(arr, by=length)
sort(arr, by=uppercase)
sort(arr, lt=(a, b) -> length(a) < length(b))

6.4 部分排序 #

julia
arr = [3, 1, 4, 1, 5, 9, 2, 6]
partialsort(arr, 1:3)
partialsortperm(arr, 1:3)

七、数组统计 #

7.1 基本统计 #

julia
arr = [1, 2, 3, 4, 5]
sum(arr)
prod(arr)
minimum(arr)
maximum(arr)
extrema(arr)

7.2 统计函数 #

julia
using Statistics

arr = [1, 2, 3, 4, 5]
mean(arr)
median(arr)
std(arr)
var(arr)

7.3 累积操作 #

julia
arr = [1, 2, 3, 4, 5]
cumsum(arr)
cumprod(arr)
accumulate(+, arr)
accumulate(*, arr)

7.4 归约操作 #

julia
arr = [1, 2, 3, 4, 5]
reduce(+, arr)
foldl(+, arr)
foldr(+, arr)
mapreduce(x -> x^2, +, arr)

八、数组变换 #

8.1 map #

julia
arr = [1, 2, 3, 4, 5]
map(x -> x^2, arr)
[x^2 for x in arr]

8.2 filter #

julia
arr = [1, 2, 3, 4, 5]
filter(x -> x % 2 == 0, arr)
filter!(x -> x % 2 == 0, arr)

8.3 replace #

julia
arr = [1, 2, 3, 2, 4, 2]
replace(arr, 2 => 10)
replace!(arr, 2 => 10)

8.4 unique #

julia
arr = [1, 2, 3, 2, 4, 2, 3]
unique(arr)
unique!(arr)
allunique(arr)

8.5 reverse #

julia
arr = [1, 2, 3, 4, 5]
reverse(arr)
reverse!(arr)

九、多维数组 #

9.1 创建矩阵 #

julia
mat = [1 2 3; 4 5 6; 7 8 9]
zeros(3, 3)
ones(2, 4)
Matrix{Float64}(undef, 3, 3)
rand(3, 3)

9.2 矩阵索引 #

julia
mat = [1 2 3; 4 5 6; 7 8 9]
mat[1, 1]
mat[2, 3]
mat[end, end]
mat[1, :]
mat[:, 1]
mat[1:2, 2:3]

9.3 线性索引 #

julia
mat = [1 2 3; 4 5 6; 7 8 9]
mat[1]
mat[5]
CartesianIndices(mat)
LinearIndices(mat)

9.4 矩阵操作 #

julia
A = [1 2; 3 4]
B = [5 6; 7 8]

A * B
A + B
A - B
A'
transpose(A)
inv(A)
det(A)

9.5 高维数组 #

julia
arr3d = rand(2, 3, 4)
size(arr3d)
ndims(arr3d)
arr3d[1, 2, 3]
arr3d[:, :, 1]

十、广播 #

10.1 点语法 #

julia
arr = [1, 2, 3, 4, 5]
arr .^ 2
arr .+ 1
sin.(arr)

10.2 广播函数 #

julia
arr = [1, 2, 3, 4, 5]
broadcast(x -> x^2, arr)
broadcast(+, arr, 1)
broadcast(+, [1, 2], [3, 4])

10.3 多数组广播 #

julia
a = [1, 2, 3]
b = [10, 20, 30]
a .+ b
a .* b

10.4 广播赋值 #

julia
arr = [1, 2, 3, 4, 5]
arr .*= 2
arr .+= 1

十一、实践练习 #

11.1 练习1:数组统计 #

julia
function array_stats(arr)
    (
        length = length(arr),
        sum = sum(arr),
        mean = sum(arr) / length(arr),
        min = minimum(arr),
        max = maximum(arr),
        unique_count = length(unique(arr))
    )
end

array_stats([1, 2, 3, 4, 5, 3, 2, 1])

11.2 练习2:数组操作 #

julia
function remove_duplicates(arr)
    seen = Set{eltype(arr)}()
    result = similar(arr, 0)
    for x in arr
        if !(x in seen)
            push!(result, x)
            push!(seen, x)
        end
    end
    return result
end

remove_duplicates([1, 2, 3, 2, 4, 3, 5])

11.3 练习3:矩阵运算 #

julia
function matrix_multiply(A, B)
    rows_A, cols_A = size(A)
    rows_B, cols_B = size(B)
    
    cols_A == rows_B || error("Dimension mismatch")
    
    C = zeros(rows_A, cols_B)
    for i in 1:rows_A
        for j in 1:cols_B
            for k in 1:cols_A
                C[i, j] += A[i, k] * B[k, j]
            end
        end
    end
    return C
end

A = [1 2; 3 4]
B = [5 6; 7 8]
matrix_multiply(A, B) == A * B

11.4 练习4:滑动窗口 #

julia
function sliding_window(arr, window_size)
    [arr[i:i+window_size-1] for i in 1:length(arr)-window_size+1]
end

sliding_window([1, 2, 3, 4, 5], 3)

十二、总结 #

本章我们学习了:

  1. 数组创建:字面量、构造函数、推导式
  2. 数组索引:基本索引、切片、视图
  3. 数组操作:添加、删除、修改元素
  4. 数组排序:sort、sortperm、自定义排序
  5. 数组统计:sum、mean、reduce
  6. 多维数组:矩阵操作、高维数组
  7. 广播:点语法和broadcast函数

接下来让我们学习Julia的元组!

最后更新:2026-03-27