Julia中如何删除矩阵指定列?对标numpy.delete等价方法
Julia 删除矩阵指定列的实现方法
Julia不需要额外引入第三方包,不管是原生索引语法还是标准库函数,都能实现和numpy.delete完全等价的按轴删除元素的效果,以下是对应示例的具体写法:
首先构造示例矩阵:
M = [0 1 2; 3 4 5; 6 7 8]
方法1:原生索引写法(最常用、性能最优)
Julia矩阵索引规则为[行筛选范围, 列筛选范围],要删除指定列,只需要在列索引位置传入排除目标列后的剩余列序号即可。
比如要删除第二列,直接写:
julia> M[:, [1,3]] 3×2 Matrix{Int64}: 0 2 3 5 6 8
如果要动态生成排除后的列索引,不用手动枚举剩余列号,可以用setdiff做集合差集:
del_col = 2 # 要删除的列号,支持传入数组批量删除多列 M[:, setdiff(1:size(M,2), del_col)]
注意:这种写法不会修改原矩阵
M,如果需要直接覆盖原矩阵,给M重新赋值即可。
方法2:标准库deleteat函数(和numpy.delete逻辑最接近)
如果你更习惯函数式调用,Julia标准库自带的deleteat可以直接指定维度删除元素,和numpy的参数逻辑几乎一致:
# 非修改原矩阵,沿列维度(dims=2)删除第2列 julia> deleteat(M, 2, dims=2) 3×2 Matrix{Int64}: 0 2 3 5 6 8
如果需要直接修改原矩阵,用带感叹号的可变版本deleteat!即可:
deleteat!(M, 2, dims=2) # 执行后原矩阵M会直接变为删除第二列后的结果
扩展说明
- 如果要删除行而不是列,只需要把维度参数改成
dims=1,或者把索引位置换到行维度即可,比如删除第二行写M[setdiff(1:size(M,1), 2), :] - 批量删除多列时,直接给删除位置传入列号数组就行,比如同时删除第1、3列:
deleteat(M, [1,3], dims=2)
内容的提问来源于stack exchange,提问作者Krish
相关产品推荐
相关产品推荐

