我想要一个函数,该函数沿着在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 维?另外,我还想同时删除多行,该怎么办?
答案 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)