给定向量或列表,如何使对称矩阵填充以一个从1开始的数字?

问题描述 投票:-2回答:3

给出一些项目,例如“ 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)

python r tidyverse
3个回答
1
投票
m <- outer(1:3,1:3,"+")
m[,1] <- 1:3
m[1,] <- 1:3

没有更多详细信息,我只能在上面提供帮助


0
投票

查看是否适合您:

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

0
投票

最坏的情况是,创建一个与向量一样长和宽度的空方阵,然后迭代[i,j]的所有组合(行和列索引),并计算每个单元格的值。

如果它是对称的,则可以跳过对角线一侧的迭代:仅计算组合为i <= j并在同一迭代中填充[i,j][j,i]的值。

© www.soinside.com 2019 - 2024. All rights reserved.