我有一个矩阵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
我尝试通过遮罩仅对一个元素起作用。
请帮助我找到方法。
答案 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。