Julia 数组

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. 生成 1 到 100 的平方数组
  2. 找出数组中所有偶数
  3. 实现矩阵转置函数(不用 '
  4. 用广播计算 sin(x) + cos(x)
  5. 性能对比: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 替代库

随时告诉我!

文章已创建 2305

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部