如何在Julia中删除n维数组的特定行?

时间:2018-12-05 17:15:16

标签: arrays julia

我想要一个函数,该函数沿着在Julia中删除的轴返回带有子数组的新数组。

更具体地说,给定一个数组(可以是n维),删除沿指定维指定的行并返回一个新数组。

在Python中,我们有这样的功能,即numpy.delete

如果是二维,则可以具有以下功能。

function delete(array::Array{<:Real,2}, obj::Int64, idx::Int64)
 """
 obj : row to be deleted
 idx : dimension(row if 1, column otherwise)
 """
if idx == 1
 new_array = array[1:size(array,1) .!= obj, : ]
else
 new_array = array[:, 1:size(array)[2] .!= obj]
end

 return new_array
end

然后,例如,我可以获得预期的结果

>a = [1 2 3; 4 5 6; 7 8 9]
 3×3 Array{Int64,2}:
 1  2  3
 4  5  6
 7  8  9
>delete(a, 2, 2)
 3×2 Array{Int64,2}:
 1  3
 4  6
 7  9

但是,如何将此功能扩展到 n 维?另外,我还想同时删除多行,该怎么办?

2 个答案:

答案 0 :(得分:0)

我不知道您需要的特定功能,但是您可以尝试以下方法:

function delete(array::Array, rows::AbstractVector{Int}, dim::Int)
    sel = Any[Colon() for i in 1:ndims(array)]
    sel[dim] = setdiff(axes(array, dim), rows)
    array[sel...]
end

delete(array::Array, rows::Int, dim::Int) = delete(array, [rows], dim)
delete(array::Array, rows::AbstractVector{Bool}, dim::Int) = delete(array, findall(rows), dim)
delete(array::Array, rows::Colon, dim::Int) = delete(array, axes(array, dim), dim)

它不进行参数检查(因此无效或重复的索引将被静默丢弃),但是如果需要,可以很容易地添加它。您也可以考虑创建view而不是副本。

编辑

核心函数可以写得更短一些:

function delete(array::Array, rows::AbstractVector{Int}, dim::Int)
    rng = setdiff(axes(array, dim), rows)
    array[ntuple(i -> i == dim ? rng : (:), ndims(array))...]
end

答案 1 :(得分:0)

这是通过修改eachslice的代码(来自v1.1.0

function delete_dim(A::AbstractArray, index, dim)
    idx1, idx2 = ntuple(d->(:), dim-1), ntuple(d->(:), ndims(A)-dim)
    view(A, idx1..., axes(A, dim) .!= index,idx2...)
end

let a = [1 2 3; 4 5 6; 7 8 9]
    delete_dim(a, 2, 2)
end

编辑:每个@bogumil 1:size(A, dim)axes(A, dim)