Matrix 基于Julia中列的重复值删除矩阵行

Matrix 基于Julia中列的重复值删除矩阵行,matrix,julia,delete-row,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 julia> A = [5.0 3.54924 6.0 3.54702 6.0 3.54655

朱莉娅还有一个挑战。想象一下,当你拥有以下矩阵时:

 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
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

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

我不知道有哪个函数可以做到这一点,但这里有一个例子:

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
适用于您的示例:

 5.0  3.54924
 6.0  3.54702
 7.0  3.0
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

我不知道有哪个函数能做到这一点,但这里有一个例子:

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
适用于您的示例:

 5.0  3.54924
 6.0  3.54702
 7.0  3.0
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[.!nonunique(DataFrame(A[:,1:1])),:]
3×2 Array{Float64,2}:
 5.0  3.54924
 6.0  3.54702
 7.0  3.54168

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

您也可以使用DataFrames.jl简单地执行转换(如果执行两次转换,性能会更差,但代码更简单):

或者你也可以写

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

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

谢谢!我也考虑过数据帧,但由于我担心速度和内存,我正在寻找一种省时的解决方案。谢谢!我还考虑了数据帧,但由于担心速度和内存,我正在寻找一种耗时更少的解决方案。好吧!我将尝试您的解决方案,因为我的目标是避免使用耗时的解决方案。非常感谢。好啊我将尝试您的解决方案,因为我的目标是避免使用耗时的解决方案。非常感谢。