Julia 数组(Array)完全指南
数组是 Julia 科学计算的基石 —— 高效、灵活、类型稳定
一、数组基础
1. 创建数组
# 一维数组(向量)
v = [1, 2, 3, 4, 5]
# 空数组(指定类型)
empty_int = Int[]
empty_float = Float64[]
# 指定类型
a = [1, 2, 3] # Int64
b = [1.0, 2.0, 3.0] # Float64
c = Any[1, "hi", 3.14] # 任意类型(性能差)
# 使用构造函数
Array{Int}(undef, 5) # 未初始化,5 个 Int
zeros(3) # [0, 0, 0]
ones(4) # [1, 1, 1, 1]
fill(7, 3) # [7, 7, 7]
2. 多维数组(矩阵、张量)
# 2×3 矩阵(行优先!)
M = [1 2 3;
4 5 6]
# 3×3 矩阵
A = [1 2 3
4 5 6
7 8 9]
# 使用构造函数
matrix = Matrix{Float64}(undef, 2, 3) # 2×3 未初始化
array3d = Array{Int}(undef, 2, 3, 4) # 3维数组
二、索引与切片(从 1 开始!)
arr = [10, 20, 30, 40, 50]
arr[1] # 10
arr[end] # 50(最后一个)
arr[end-1] # 40
# 切片(返回新数组)
arr[2:4] # [20, 30, 40]
arr[1:2:end] # 步长 2 → [10, 30, 50]
arr[:] # 复制整个数组
多维索引
M = [1 2 3;
4 5 6]
M[1, 2] # 第1行第2列 → 2
M[2, :] # 第2行 → [4, 5, 6]
M[:, 2] # 第2列 → [2, 5]
M[1:2, 2:3] # 子矩阵
三、常用操作函数
| 函数 | 用途 | 示例 |
|---|---|---|
push!(arr, x) | 末尾添加 | push!(v, 6) |
pop!(arr) | 删除末尾 | pop!(v) |
pushfirst!, popfirst! | 头部操作 | |
append!(arr, collection) | 追加数组 | |
deleteat!(arr, i) | 删除索引 i | |
insert!(arr, i, x) | 插入到位置 i | |
sort!(arr) | 原地排序 | sort!(v) |
reverse(arr) | 反转(返回新数组) | |
in(x, arr) | 判断包含 | 30 in arr |
findall(cond, arr) | 查找满足条件的索引 |
v = [3, 1, 4, 1, 5]
push!(v, 9) # [3,1,4,1,5,9]
pop!(v) # [3,1,4,1,5]
sort(v) # [1,1,3,4,5](不修改原数组)
sort!(v) # v 被修改
四、数组推导式(Comprehensions)
# 平方数组
[x^2 for x in 1:5] # [1, 4, 9, 16, 25]
# 条件推导
[x for x in 1:10 if x % 2 == 0] # [2,4,6,8,10]
# 二维推导
[i + j for i in 1:3, j in 1:2]
# 3×2 矩阵
五、广播(Broadcasting)—— 向量化神器
x = [1, 2, 3]
y = [10, 20, 30]
x .+ y # [11, 22, 33](逐元素加)
sin.(x) # [sin(1), sin(2), sin(3)]
x .^ 2 # [1, 4, 9]
# 任意函数广播
f(x) = x^2 + 2x + 1
f.(x) # [4, 9, 16]
@.宏:自动为所有运算加.
@. x^2 + 2x + 1 # 等价于 x.^2 .+ 2.*x .+ 1
六、数组形状与维度操作
A = [1 2 3; 4 5 6] # 2×3
size(A) # (2, 3)
ndims(A) # 2
length(A) # 6(总元素数)
# 改变形状(共享内存!)
B = reshape(A, 3, 2) # 3×2 矩阵
B[1,1] = 99
A # A 也被修改!
# 展平
vec(A) # [1,4,2,5,3,6](列优先)
七、复制 vs 视图(重要!)
a = [1, 2, 3, 4]
# 复制(独立内存)
b = copy(a)
b[1] = 99
a # 不变
# 视图(共享内存,性能更高)
c = @view a[2:3] # 或 a[2:3]
c[1] = 88
a # 变为 [1, 88, 3, 4]
推荐:大数组切片用
@view避免复制
八、性能优化技巧
1. 类型稳定
# 好:类型稳定
function sum_positives(v::Vector{Int})
s = 0
for x in v
x > 0 && (s += x)
end
return s
end
# 坏:返回类型不一致
bad(x) = x > 0 ? x : "negative"
2. 预分配数组
# 慢:动态增长
result = Int[]
for i in 1:1000000
push!(result, i^2)
end
# 快:预分配
result = Vector{Int}(undef, 1000000)
for i in 1:1000000
result[i] = i^2
end
3. 使用 eachindex 遍历
for i in eachindex(arr)
arr[i] += 1
end
九、线性代数(内置支持)
A = [1 2; 3 4]
b = [5, 6]
A * b # 矩阵乘向量
A' # 转置
det(A) # 行列式
inv(A) # 逆矩阵
eigen(A) # 特征值分解
所有操作都调用高性能 BLAS/LAPACK
十、综合示例:图像处理模拟
# 生成 100×100 灰度图(随机噪声)
img = rand(0:255, 100, 100)
# 高斯模糊(3×3 核)
function blur(img)
out = similar(img)
rows, cols = size(img)
for i in 2:rows-1, j in 2:cols-1
out[i,j] = round(Int, mean(img[i-1:i+1, j-1:j+1]))
end
return out
end
blurred = blur(img)
# 保存为 CSV(可导入 Python)
using DelimitedFiles
writedlm("blurred.csv", blurred, ',')
十一、数组速查表
| 操作 | 语法 |
|---|---|
| 创建 | [1,2,3], zeros(3,3) |
| 索引 | arr[1], M[1,2] |
| 切片 | arr[2:4], M[:, 2] |
| 添加 | push!(arr, x) |
| 广播 | sin.(arr) |
| 视图 | @view arr[2:5] |
| 复制 | copy(arr) |
| 形状 | reshape(arr, 2, 3) |
| 排序 | sort(arr) / sort!(arr) |
| 统计 | sum(arr), mean(arr), std(arr) |
小练习(立即上手)
- 生成 1 到 100 的平方数组
- 找出数组中所有偶数
- 实现矩阵转置函数(不用
') - 用广播计算
sin(x) + cos(x) - 性能对比:
push!vs 预分配
答案示例
# 1. 平方数组
squares = [x^2 for x in 1:100]
# 2. 偶数
evens = filter(x -> x % 2 == 0, 1:100)
# 3. 手动转置
function mytranspose(M)
rows, cols = size(M)
return [M[i,j] for j in 1:cols, i in 1:rows]
end
# 4. 广播
x = range(0, 2π, length=100)
y = sin.(x) .+ cos.(x)
# 5. 性能测试
using BenchmarkTools
n = 10_000_000
@btime begin
a = Int[]
for i in 1:$n
push!(a, i)
end
end
@btime begin
b = Vector{Int}(undef, $n)
for i in 1:$n
b[i] = i
end
end
恭喜!你已精通 Julia 数组!
下一站:
需要我:
- 生成 完整性能对比图?
- 实现 稀疏数组 示例?
- 写一个 迷你 NumPy 替代库?
随时告诉我!