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

Deleting rows of matrix based on duplicated values of a column in Julia

这是 Julia 的另一个挑战。想象一下当有以下矩阵时:

 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

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

我不知道执行此操作的函数,但这里有一个示例:

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

你也可以简单地使用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

速度更快,占用内存更少,但更混乱。