根据Julia中列的重复值删除矩阵行

时间:2018-06-04 00:39:28

标签: matrix julia delete-row

这是朱莉娅的另一个挑战。想象一下,何时有以下矩阵:

 5.0  3.54924
 6.0  3.54702
 6.0  3.54655
 7.0  3.54168
 7.0  3.0

我想删除第一列元素重复的矩阵行。这将产生以下矩阵,例如:

 5.0  3.54924
 6.0  3.54702
 7.0  3.0

删除行是任意的,因为我们不会为第一列保留重复的值。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

我不知道这样做的功能,但这是一个例子:

function unique_rows(A::AbstractMatrix{T}) where T
    # find the index of unique rows
    row_indices = Int[]
    row_values = Set{T}()
    for i in 1:size(A, 1)
        v = A[i, 1]
        if !(v in row_values)
            push!(row_indices, i)
            push!(row_values, v)
        end
    end
    # construct the new matrix
    B = similar(A, (length(row_indices), size(A, 2)))
    for j in 1:size(A, 2), i in 1:length(row_indices)
        B[i, j] = A[row_indices[i], j]
    end
    return B
end

应用于您的示例:

julia> A = [5.0  3.54924
            6.0  3.54702
            6.0  3.54655
            7.0  3.54168
            7.0  3.0]
5×2 Array{Float64,2}:
 5.0  3.54924
 6.0  3.54702
 6.0  3.54655
 7.0  3.54168
 7.0  3.0    

julia> unique_rows(A)
3×2 Array{Float64,2}:
 5.0  3.54924
 6.0  3.54702
 7.0  3.54168

答案 1 :(得分:2)

此外,您可以使用DataFrames.jl执行此操作(执行转换两次时性能会更差,但代码更简单):

julia> A = [5.0  3.54924
                   6.0  3.54702
                   6.0  3.54655
                   7.0  3.54168
                   7.0  3.0]
5×2 Array{Float64,2}:
 5.0  3.54924
 6.0  3.54702
 6.0  3.54655
 7.0  3.54168
 7.0  3.0

julia> Matrix(unique(DataFrame(A), 1))
3×2 Array{Float64,2}:
 5.0  3.54924
 6.0  3.54702
 7.0  3.54168

或者你可以写

julia> A[.!nonunique(DataFrame(A[:,1:1])),:]
3×2 Array{Float64,2}:
 5.0  3.54924
 6.0  3.54702
 7.0  3.54168

速度更快,使用的内存更少,但更麻烦。