Python 从具有值的组合创建矩阵

Python 从具有值的组合创建矩阵,python,numpy,matrix,numpy-ndarray,Python,Numpy,Matrix,Numpy Ndarray,我有一些组合,比如 (A,B) = 1 (A,C) = 0 (A,D) = 1 (B,C) = 1 (B,D) = 1 (C,D) = 0 你知道如何有效地用所有这些组合中的0,1值创建一个四乘四矩阵吗?因此,结果将类似于: A B C D A - 1 0 1 B 1 - 1 1 C 0 1 - 0 D 1 1 0 - 想象一下,如果“组合”以以下格式(或类似格式)存储在文件中: A、B、1 A、 C,0 A、 D,1 B、 C,1 B、 D,1 C、 D,0 然后你可以做: df=p

我有一些组合,比如

(A,B) = 1
(A,C) = 0
(A,D) = 1
(B,C) = 1
(B,D) = 1
(C,D) = 0
你知道如何有效地用所有这些组合中的0,1值创建一个四乘四矩阵吗?因此,结果将类似于:

  A B C D
A - 1 0 1
B 1 - 1 1
C 0 1 - 0
D 1 1 0 -
想象一下,如果“组合”以以下格式(或类似格式)存储在文件中:

A、B、1
A、 C,0
A、 D,1
B、 C,1
B、 D,1
C、 D,0
然后你可以做:

df=pd.read\u csv(文件名,标题=None)
示例(使用示例数据):

txt=“”A、B、1
A、 C,0
A、 D,1
B、 C,1
B、 D,1
C、 D,0
"""
df=pd.read\u csv(io.StringIO(txt),header=None)
现在
df
包含:

0112
0 A B 1
1 A C 0
2 A D 1
3 B C 1
4 B D 1
5cd0
从这一点出发,稍加按摩就能得到你想要的东西:

#所有标签(用于行和列)
r=已排序(集合(df[0])集合(df[1]))
#上三角
z=(
df.set_索引([0,1])
.reindex(pd.MultiIndex.from_乘积([r,r]))
.挤压
.取消堆叠(1)
)
#填充下三角部分,使z对称
z=z.where(~z.isna(),z.T)
我们得到:

>>z
A、B、C、D
A NaN 1.0 0.0 1.0
B 1.0 NaN 1.0 1.0
C 0.0 1.0 NaN 0.0
D 1.0 1.0 0 0.0 NaN
注意:如果您希望只停留在
int
-中(并将对角线设置为0),则:

z=(
df.set_索引([0,1])
.reindex(pd.MultiIndex.from_乘积([r,r]),fill_值=0)
.挤压
.取消堆叠(1)
)
z+=z.T
现在:

>>z
A、B、C、D
101
b1011
C 0 1 0 0
D 110 0
用于速度

现在,如果您确实知道您正在处理4x4矩阵,并且顺序与您所指示的完全一致(按上三角形排序),则可以执行以下操作以加快设置:

#以某种方式获取三角形值(例如,读取文件并丢弃
#除了最后一个值以外的所有值;
#这里,我们仅从上面的df中获取它们:
tri=df[2].值#np.数组([1,0,1,1,0])
#现在,在纯粹的努比:
z=np.zero((4,4),dtype=int)
z[np.triu_指数(4,1)]=tri
z+=z.T
结果是一个简单的
numpy
数组(无标签):

>>z
[[0 1 0 1]
[1 0 1 1]
[0 1 0 0]
[1 1 0 0]]
想象一下,如果“组合”以以下格式(或类似格式)存储在文件中:

A、B、1
A、 C,0
A、 D,1
B、 C,1
B、 D,1
C、 D,0
然后你可以做:

df=pd.read\u csv(文件名,标题=None)
示例(使用示例数据):

txt=“”A、B、1
A、 C,0
A、 D,1
B、 C,1
B、 D,1
C、 D,0
"""
df=pd.read\u csv(io.StringIO(txt),header=None)
现在
df
包含:

0112
0 A B 1
1 A C 0
2 A D 1
3 B C 1
4 B D 1
5cd0
从这一点出发,稍加按摩就能得到你想要的:

#所有标签(用于行和列)
r=已排序(集合(df[0])集合(df[1]))
#上三角
z=(
df.set_索引([0,1])
.reindex(pd.MultiIndex.from_乘积([r,r]))
.挤压
.取消堆叠(1)
)
#填充下三角部分,使z对称
z=z.where(~z.isna(),z.T)
我们得到:

>>z
A、B、C、D
A NaN 1.0 0.0 1.0
B 1.0 NaN 1.0 1.0
C 0.0 1.0 NaN 0.0
D 1.0 1.0 0 0.0 NaN
注意:如果您希望只停留在
int
-中(并将对角线设置为0),则:

z=(
df.set_索引([0,1])
.reindex(pd.MultiIndex.from_乘积([r,r]),fill_值=0)
.挤压
.取消堆叠(1)
)
z+=z.T
现在:

>>z
A、B、C、D
101
b1011
C 0 1 0 0
D 110 0
用于速度

现在,如果您确实知道您正在处理4x4矩阵,并且顺序与您所指示的完全一致(按上三角形排序),则可以执行以下操作以加快设置:

#以某种方式获取三角形值(例如,读取文件并丢弃
#除了最后一个值以外的所有值;
#这里,我们仅从上面的df中获取它们:
tri=df[2].值#np.数组([1,0,1,1,0])
#现在,在纯粹的努比:
z=np.zero((4,4),dtype=int)
z[np.triu_指数(4,1)]=tri
z+=z.T
结果是一个简单的
numpy
数组(无标签):

>>z
[[0 1 0 1]
[1 0 1 1]
[0 1 0 0]
[1 1 0 0]]

通过透视操作,您可以轻松完成此操作。假设您的组合出现在一个csv文件中,看起来像这样(它们也可以很容易出现在一些数据结构中,如字典或2D列表):

然后你可以这样做:

df = pd.read_csv('sample.csv', header=None)
df.columns = ['col1','col2', 'value']

df = df.pivot(index='col1',columns='col2',values='value')
df =df.where(~df.isna(), df.T) #reflects half-matrix across diagonal
df.fillna('-', inplace=True)

print(df)

#output:
col2  A  B  C  D
col1            
A     -  1  0  1
B     1  -  1  1
C     0  1  -  0
D     1  1  0  -

通过pivot操作,您可以轻松完成此操作。假设您的组合出现在csv文件中,如下所示(它们也可以出现在某些数据结构中,如字典或2D列表中):

然后你可以这样做:

df = pd.read_csv('sample.csv', header=None)
df.columns = ['col1','col2', 'value']

df = df.pivot(index='col1',columns='col2',values='value')
df =df.where(~df.isna(), df.T) #reflects half-matrix across diagonal
df.fillna('-', inplace=True)

print(df)

#output:
col2  A  B  C  D
col1            
A     -  1  0  1
B     1  -  1  1
C     0  1  -  0
D     1  1  0  -

你的矩阵的对角线就是零吗?你也尝试过什么,你有一个有效的解决方案,只是在寻找一个更快的方法吗?如果有,请包括它。这些组合是如何存储的?是的,对角线可以是零!我想不出任何可行的解决方案!这些组合存储在文本文件中。请注意,python中的矩阵,在其simp中Nest form可以被认为是一个列表列表。这里,它是一个包含4个长度为4的列表的列表:这4个列表中的每一个都是一行。对于一些实际的矩阵结构,你也可以看到numpy,这可能会帮助你更快地构建它。你的矩阵的对角线是零吗?还有,你尝试过什么,你有一个有效的解决方案吗king for a faster way?如果是,请包括它。这些组合是如何存储的?是的,对角线可以是零!我想不出任何可行的解决方案!这些组合存储在文本文件中。请注意,python中的矩阵,以其最简单的形式,可以被视为列表列表。这里,它是一个包含4个长度为4的列表的列表:每个列表4列表是一行。你也可以看到一些实际矩阵结构的numpy,这可能会帮助你更快地构建它。