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],原数组被修改下一步
学习完数组后,请继续学习: