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