Удаление строк матрицы на основе дублированных значений столбца в Julia - PullRequest
0 голосов
/ 04 июня 2018

Вот еще одна проблема у Юлии.Представьте себе, когда у вас есть следующая матрица:

 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 голосов
/ 04 июня 2018

Также вы можете просто сделать это, используя 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

, который немного быстрее и использует меньше памяти, но более грязный.

0 голосов
/ 04 июня 2018

Я не знаю функции, которая делает это, но вот один пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...