这是朱莉娅的另一个挑战。想象一下,何时有以下矩阵:
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
删除行是任意的,因为我们不会为第一列保留重复的值。我怎样才能做到这一点?
答案 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
速度更快,使用的内存更少,但更麻烦。