gpt4 book ai didi

matrix - 如何在 Julia 中创建关联矩阵

转载 作者:行者123 更新时间:2023-12-04 20:34:47 27 4
gpt4 key购买 nike

我想创建一个关联矩阵。
我有一个包含 3 列的文件,例如:

id x  y   
A 22 2
B 4 21
C 21 360
D 26 2
E 22 58
F 2 347

我想要一个矩阵(没有列名和行名):
  2 4 21 22 26 58 347 360   
A 1 0 0 1 0 0 0 0
B 0 1 1 0 0 0 0 0
C 0 0 1 0 0 0 0 1
D 1 0 0 0 1 0 0 0
E 0 0 0 1 0 1 0 0
F 1 0 0 0 0 0 1 0

我已经开始这样的代码:
haps = readdlm("File.txt",header=true)      
hap1_2 = map(Int64,haps[1][:,2:end])
ID = (haps[1][:,1])
dic1 = Dict()

for (i in 1:21)
dic1[ID[i]] = hap1_2[i,:]
end

X=[zeros(21,22)]; #the original file has 21 rows and 22 columns
X1 = hcat(ID,X)

现在的问题是我不知道如何在特定列中用 1 填充矩阵,如上例所示。
我也不确定我是否走对了路。

任何可以帮助我的建议?

谢谢!

最佳答案

NamedArrays是一个简洁的包,它允许命名行和列,似乎适合这个问题。假设数据在 data.csv ,这是一种解决方法(安装 NamedArraysPkg.add("NamedArrays")):

data,header = readcsv("data.csv",header=true);
# get the column names by looking at unique values in columns
cols = unique(vec([(header[j+1],data[i,j+1]) for i in 1:size(data,1),j=1:2]))
# row names from ID column
rows = data[:,1]

using NamedArrays
narr = NamedArray(zeros(Int,length(rows),length(cols)),(rows,cols),("id","attr"));
# now stamp in the 1s in the right places
for r=1:size(data,1),c=2:size(data,2) narr[data[r,1],(header[c],data[r,c])] = 1 ; end

现在我们有了(注意我转置了 narr 以获得更好的打印输出):
julia> narr'
10x6 NamedArray{Int64,2}:
attr ╲ id │ A B C D E F
──────────┼─────────────────
("x",22) │ 1 0 0 0 1 0
("x",4) │ 0 1 0 0 0 0
("x",21) │ 0 0 1 0 0 0
("x",26) │ 0 0 0 1 0 0
("x",2) │ 0 0 0 0 0 1
("y",2) │ 1 0 0 1 0 0
("y",21) │ 0 1 0 0 0 0
("y",360) │ 0 0 1 0 0 0
("y",58) │ 0 0 0 0 1 0
("y",347) │ 0 0 0 0 0 1

但是,如果 DataFrames是必要的,类似的技巧应该适用。

- - - - - 更新 - - - - -

如果应该忽略值的列,即 x=2 和 y=2 都应该在列上为值 2 设置 1,则代码变为:
using NamedArrays
data,header = readcsv("data.csv",header=true);
rows = data[:,1]
cols = map(string,sort(unique(vec(data[:,2:end]))))
narr = NamedArray(zeros(Int,length(rows),length(cols)),(rows,cols),("id","attr"));
for r=1:size(data,1),c=2:size(data,2) narr[data[r,1],string(data[r,c])] = 1 ; end

给予:
julia> narr
6x8 NamedArray{Int64,2}:
id ╲ attr │ 2 4 21 22 26 58 347 360
──────────┼───────────────────────────────────────
A │ 1 0 0 1 0 0 0 0
B │ 0 1 1 0 0 0 0 0
C │ 0 0 1 0 0 0 0 1
D │ 1 0 0 0 1 0 0 0
E │ 0 0 0 1 0 1 0 0
F │ 1 0 0 0 0 0 1 0

关于matrix - 如何在 Julia 中创建关联矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37797937/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com