给出一些项目,例如“ a”,“ b”,“ c”。我想使一个对称矩阵看起来像这样:
a b c
a 1 2 3
b 2 4 5
c 3 5 6
矩阵填充了从一开始的一系列数字。由于矩阵是对称的,因此对角线上方的值应与对角线下方的值相同。另外,我也想在对角线中填写数字。
Update:我已经完成了Python的工作,但是我是Python的新手,我的代码可能很多余。 我也希望收到用R写的答案。
import pandas as pd
import numpy as np
import itertools
var = ["a","b","c"]
mylist = list(itertools.combinations_with_replacement(var, 2))
df = pd.DataFrame(mylist,columns = ["col_1","col_2"])
df["num"] = list(range(1,len(df['col_1'])+1))
df2 = pd.DataFrame()
df2["col_1"] = df["col_2"]
df2["col_2"] = df["col_1"]
df2["num"] = df["num"]
mydf = df.append(df2)
mydf['label'] = mydf[['col_1', 'col_2']].apply(lambda x: '_'.join(x), axis=1)
mydf = mydf[["label","num"]]
mylist_2 = list(itertools.product(var, repeat=2))
df_2 = pd.DataFrame(mylist_2,columns = ["col_1","col_2"])
df_2["label"] = df_2[['col_1', 'col_2']].apply(lambda x: '_'.join(x), axis=1)
new_df = pd.merge(df_2[["label"]],mydf,on = "label",how = "inner").drop_duplicates()
new_list = list(new_df.num)
my_array = np.asarray(new_list).reshape(len(var),len(var))
matrix_df = pd.DataFrame(my_array,index=var,columns=var)
m <- outer(1:3,1:3,"+")
m[,1] <- 1:3
m[1,] <- 1:3
没有更多详细信息,我只能在上面提供帮助
查看是否适合您:
a,b,c = [1,2,3]
val = [a,b,c]
for i in val:
if i==a:
lst = [a,b,c]
else:
lst = [i,b+i,c+i]
print(*lst)
输出:
1 2 3
2 4 5
3 5 6
最坏的情况是,创建一个与向量一样长和宽度的空方阵,然后迭代[i,j]
的所有组合(行和列索引),并计算每个单元格的值。
如果它是对称的,则可以跳过对角线一侧的迭代:仅计算组合为i <= j
并在同一迭代中填充[i,j]
和[j,i]
的值。