【问题标题】:How to delete the specific row of n-dimensional array in Julia?如何删除Julia中n维数组的特定行?
【发布时间】:2018-12-05 17:15:15
【问题描述】:

我想要一个函数,它返回一个新数组,其中包含沿 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 维度?另外,我也想同时删除多行,怎么办?

【问题讨论】:

    标签: arrays julia


    【解决方案1】:

    我不知道您需要什么特定功能,但您可以试试这个:

    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
    

    【讨论】:

      【解决方案2】:

      这是通过修改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
      

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

      【讨论】:

      • 一个小评论-AFAIK最好写axes(A, dim)而不是1:size(A, dim)(就像在我的解决方案中一样),因为数组通常不必是1-indexed。
      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2018-12-26
      相关资源
      最近更新 更多