Skip to content

Julia 数组

数组是 Julia 中最重要的数据结构之一,用于存储有序的元素集合。Julia 的数组功能强大,支持多维数组和丰富的操作函数。

创建数组

字面量创建

julia
# 一维数组(向量)
arr = [1, 2, 3, 4, 5]
println(arr)  # [1, 2, 3, 4, 5]

# 指定类型
arr_float = Float64[1.0, 2.0, 3.0]

# 空数组
empty_arr = Int[]
empty_arr2 = []  # Any 类型

使用范围创建

julia
# 使用范围
arr = collect(1:5)       # [1, 2, 3, 4, 5]
arr = collect(1:2:10)    # [1, 3, 5, 7, 9],步长为2
arr = collect(10:-1:1)   # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

# 使用 range
arr = collect(range(0, 1, length=5))  # [0.0, 0.25, 0.5, 0.75, 1.0]

使用构造函数

julia
# 全零数组
zeros(5)              # 5个0.0
zeros(Int, 5)         # 5个0 (整数)
zeros(3, 4)           # 3×4 全零矩阵

# 全一数组
ones(5)               # 5个1.0
ones(Int, 3)          # 3个1 (整数)

# 未初始化数组(性能更好,但值随机)
arr = Vector{Int}(undef, 5)
mat = Matrix{Float64}(undef, 3, 4)

# 填充特定值
fill(7, 5)            # [7, 7, 7, 7, 7]
fill("a", 3)          # ["a", "a", "a"]

使用推导式

julia
# 数组推导式
squares = [x^2 for x in 1:5]          # [1, 4, 9, 16, 25]
evens = [x for x in 1:10 if x % 2 == 0]  # [2, 4, 6, 8, 10]

# 多维推导式
matrix = [i + j for i in 1:3, j in 1:4]  # 3×4 矩阵

数组索引

Julia 数组索引从 1 开始(不是 0)。

基本索引

julia
arr = [10, 20, 30, 40, 50]

# 访问单个元素
println(arr[1])   # 10(第一个元素)
println(arr[end]) # 50(最后一个元素)
println(arr[end-1])  # 40(倒数第二个)

# 修改元素
arr[1] = 100
println(arr)  # [100, 20, 30, 40, 50]

范围索引(切片)

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

# 获取子数组
println(arr[2:5])      # [2, 3, 4, 5]
println(arr[1:2:end])  # [1, 3, 5, 7, 9],步长为2
println(arr[end:-1:1]) # 反转数组

# 从开头或到结尾
println(arr[1:3])      # [1, 2, 3]
println(arr[8:end])    # [8, 9, 10]

多维数组索引

julia
# 创建 3×4 矩阵
matrix = [i + j*10 for i in 1:3, j in 1:4]
# 3×4 Matrix{Int64}:
# 11  21  31  41
# 12  22  32  42
# 13  23  33  43

# 访问单个元素
println(matrix[2, 3])  # 32(第2行第3列)

# 访问整行或整列
println(matrix[1, :])  # 第1行: [11, 21, 31, 41]
println(matrix[:, 2])  # 第2列: [21, 22, 23]

# 子矩阵
println(matrix[1:2, 2:3])  # 2×2 子矩阵

数组操作

添加元素

julia
arr = [1, 2, 3]

# 末尾添加
push!(arr, 4)
println(arr)  # [1, 2, 3, 4]

# 开头添加
pushfirst!(arr, 0)
println(arr)  # [0, 1, 2, 3, 4]

# 指定位置插入
insert!(arr, 3, 100)
println(arr)  # [0, 1, 100, 2, 3, 4]

# 追加另一个数组
append!(arr, [5, 6])
println(arr)  # [0, 1, 100, 2, 3, 4, 5, 6]

删除元素

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

# 删除末尾元素
last = pop!(arr)
println(last)  # 5
println(arr)   # [1, 2, 3, 4]

# 删除开头元素
first = popfirst!(arr)
println(first)  # 1
println(arr)    # [2, 3, 4]

# 删除指定位置
deleted = deleteat!(arr, 2)
println(arr)  # [2, 4]

# 删除特定值
arr = [1, 2, 3, 2, 4]
filter!(x -> x != 2, arr)
println(arr)  # [1, 3, 4]

合并数组

julia
a = [1, 2, 3]
b = [4, 5, 6]

# 水平拼接(创建新数组)
c = vcat(a, b)     # [1, 2, 3, 4, 5, 6]
c = [a; b]         # 同上

# 垂直拼接(对于矩阵)
m1 = [1 2; 3 4]
m2 = [5 6; 7 8]
m = vcat(m1, m2)   # 4×2 矩阵

# 水平拼接(对于矩阵)
m = hcat(m1, m2)   # 2×4 矩阵
m = [m1 m2]        # 同上

复制数组

julia
arr = [1, 2, 3]

# 浅拷贝
arr_copy = copy(arr)

# 深拷贝(对于嵌套数组)
nested = [[1, 2], [3, 4]]
nested_copy = deepcopy(nested)

数组属性

julia
arr = [1, 2, 3, 4, 5]
matrix = [1 2 3; 4 5 6]  # 2×3 矩阵

# 长度
println(length(arr))     # 5
println(length(matrix))  # 6(总元素数)

# 维度
println(ndims(arr))      # 1
println(ndims(matrix))   # 2

# 尺寸
println(size(arr))       # (5,)
println(size(matrix))    # (2, 3)
println(size(matrix, 1)) # 2(行数)
println(size(matrix, 2)) # 3(列数)

# 元素类型
println(eltype(arr))     # Int64

# 是否为空
println(isempty(arr))    # false
println(isempty([]))     # true

数组计算

基本统计

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

println(sum(arr))       # 55(求和)
println(prod(arr))      # 3628800(乘积)
println(minimum(arr))   # 1(最小值)
println(maximum(arr))   # 10(最大值)
println(extrema(arr))   # (1, 10)(最小最大值)

using Statistics
println(mean(arr))      # 5.5(平均值)
println(median(arr))    # 5.5(中位数)
println(std(arr))       # 3.0277...(标准差)
println(var(arr))       # 9.166...(方差)

位置查找

julia
arr = [10, 20, 30, 40, 50]

# 查找最大最小值位置
println(argmin(arr))  # 1(最小值位置)
println(argmax(arr))  # 5(最大值位置)

# 查找特定值
println(findfirst(==(30), arr))  # 3
println(findall(x -> x > 25, arr))  # [3, 4, 5]

# 检查元素是否存在
println(30 in arr)  # true
println(in(30, arr))  # true

排序

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

# 返回排序后的新数组
sorted = sort(arr)
println(sorted)  # [1, 1, 2, 3, 4, 5, 6, 9]

# 原地排序
sort!(arr)

# 降序排序
sorted_desc = sort(arr, rev=true)

# 按自定义规则排序
words = ["banana", "apple", "cherry"]
sort(words, by=length)  # 按长度排序

# 获取排序索引
arr = [30, 10, 20]
println(sortperm(arr))  # [2, 3, 1]

反转

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

# 返回反转后的新数组
reversed = reverse(arr)
println(reversed)  # [5, 4, 3, 2, 1]

# 原地反转
reverse!(arr)

向量化操作

广播运算(点运算)

使用 . 进行元素级运算:

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

# 元素级运算
println(arr .+ 10)    # [11, 12, 13, 14, 15]
println(arr .* 2)     # [2, 4, 6, 8, 10]
println(arr .^ 2)     # [1, 4, 9, 16, 25]

# 两个数组运算
a = [1, 2, 3]
b = [4, 5, 6]
println(a .+ b)  # [5, 7, 9]
println(a .* b)  # [4, 10, 18]

# 函数广播
println(sqrt.(arr))  # [1.0, 1.414..., 1.732..., 2.0, 2.236...]
println(sin.(arr))

map 函数

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

# 对每个元素应用函数
result = map(x -> x^2, arr)
println(result)  # [1, 4, 9, 16, 25]

# 多个数组
a = [1, 2, 3]
b = [4, 5, 6]
result = map((x, y) -> x + y, a, b)
println(result)  # [5, 7, 9]

filter 函数

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

# 过滤元素
evens = filter(x -> x % 2 == 0, arr)
println(evens)  # [2, 4, 6, 8, 10]

# 原地过滤
arr2 = [1, 2, 3, 4, 5]
filter!(x -> x > 2, arr2)
println(arr2)  # [3, 4, 5]

reduce 函数

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

# 累积计算
sum_result = reduce(+, arr)
println(sum_result)  # 15

product = reduce(*, arr)
println(product)  # 120

# 带初始值
result = reduce(+, arr, init=100)
println(result)  # 115

多维数组

创建多维数组

julia
# 2D 数组(矩阵)
matrix = [1 2 3; 4 5 6; 7 8 9]
# 3×3 Matrix{Int64}:
# 1  2  3
# 4  5  6
# 7  8  9

# 3D 数组
arr3d = zeros(2, 3, 4)  # 2×3×4 数组

# reshape
arr = collect(1:12)
matrix = reshape(arr, 3, 4)  # 3×4 矩阵

矩阵运算

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

# 矩阵加法
C = A + B

# 矩阵乘法
C = A * B    # 矩阵乘法
C = A .* B   # 元素级乘法

# 转置
At = A'      # 或 transpose(A)

# 逆矩阵
using LinearAlgebra
Ainv = inv(A)

# 行列式
det(A)

# 特征值
eigvals(A)

常用技巧

预分配数组

julia
# 低效:动态增长
result = []
for i in 1:1000
    push!(result, i^2)
end

# 高效:预分配
result = Vector{Int}(undef, 1000)
for i in 1:1000
    result[i] = i^2
end

# 或使用推导式
result = [i^2 for i in 1:1000]

视图(避免复制)

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

# 切片创建副本
slice = arr[2:4]  # 新数组

# view 创建视图(不复制)
v = view(arr, 2:4)  # 或 @view arr[2:4]
v[1] = 100
println(arr)  # [1, 100, 3, 4, 5],原数组被修改

下一步

学习完数组后,请继续学习:

本站内容仅供学习和研究使用。