如何在Julia中掩盖矩阵的特定行元素?

时间:2018-11-02 23:56:20

标签: julia

我有一个矩阵A,其中A[:,1]Bus_id。因此Bus_id是1,3,4和6。对于处理,我将Bus_id等同于连续的行索引,请参见A_new矩阵。

julia> A=[1 1 3;3 1 1; 4 1 7;6 1 1]
4×3 Array{Int64,2}:
 1  1  3
 3  1  1
 4  1  7
 6  1  1


julia> A_new
 1  1  1
 2  1  1
 3  1  1
 4  1  1

现在,我有另一个矩阵B,其中包含矩阵A的某些元素。我希望将B矩阵的bus_id转换为b_new。我不知道如何解释这个问题。

julia> B= [3 1 1; 4 1 7]
2×3 Array{Int64,2}:
 3  1  1
 6  1  1

julia> B_new
 2  1  1
 4  1  7

我尝试通过遮罩仅对一个元素起作用。

请帮助我找到方法。

1 个答案:

答案 0 :(得分:0)

您可能正在使用Bus_id作为索引。如果您想重新编号业务ID,但又不想丢失用原始业务ID索引的交易记录,那么您想做的事情自然就适合Dict,它将Bus_id从一个转换为另一个。

立即出现的一个问题是,如果B中的某些条目没有翻译自A,但是已经设置为A的新键中的数字,该怎么办?潜在的交叉链接数据库混乱!相反,新ID必须尽可能唯一!我建议让他们消极。

如果您使用矩阵A作为翻译的键(并假设 A[:,1] 中的所有条目都是唯一的-如果不是逻辑可能首先需要删除重复项),那么dict用法如下所示:

A = [1 1 3; 3 1 1; 4 1 7; 6 1 1]
B = [3 1 1; 6 1 1]

function consecutive_row_indexing(mat)
    dict = Dict{Int, Int}()
    for (i,n) in enumerate(mat[:,1])
        dict[n] = -i
    end
    dict
end

function renumberbus_ids!(mat, dict)
    for i in 1:size(mat)[1]
        if haskey(dict, mat[i,1])
           mat[i,1] = dict[mat[i,1]]
        end
    end
    mat
end

d = consecutive_row_indexing(A)
println(renumberbus_ids!(A, d))
println(renumberbus_ids!(B, d))


output: <code> 
[-1 1 3; -2 1 1; -3 1 7; -4 1 1]
[-2 1 1; -4 1 1] 

如果您仍然真的希望B矩阵的索引列为正整数,只需在上面代码的第七行将= -i替换为= i。