使用SciPy/Pandas将Python:Edge列表添加到邻接矩阵显示索引器:列索引(3)超出范围

使用SciPy/Pandas将Python:Edge列表添加到邻接矩阵显示索引器:列索引(3)超出范围,python,numpy,matrix,scipy,edges,Python,Numpy,Matrix,Scipy,Edges,我有一个带有边缘列表的文本文件(egde.txt): 边的权重是浮动值,如图所示,分隔符是空白,我必须在文本文件中保持这种方式。我想将此边缘列表转换为如下所示的矩阵,并将其存储在CSV文件中: 1 2 3 1 0.000000 0.257905 0.775104 2 0.346100 0.000000 0.438893 3 0.753358 0.222349 0.000000 我有以下代码(txttocsv2.py),我原以为

我有一个带有边缘列表的文本文件(
egde.txt
):

边的权重是浮动值,如图所示,分隔符是空白,我必须在文本文件中保持这种方式。我想将此边缘列表转换为如下所示的矩阵,并将其存储在CSV文件中:

    1         2         3
1   0.000000  0.257905  0.775104
2   0.346100  0.000000  0.438893
3   0.753358  0.222349  0.000000  
我有以下代码(
txttocsv2.py
),我原以为可以,但不幸的是没有:

import numpy as np
import scipy.sparse as sps
import csv
import pandas as pd

with open('connectivity.txt', 'r') as fil:

    A = np.genfromtxt(fil)

    i, j, weight = A[:,0], A[:,1], A[:,2]

    dim =  max(len(set(i)), len(set(j)))

    B = sps.lil_matrix((dim, dim))
    for i,j,w in zip(i,j,weight):
        B[i,j] = w

    for row in B: #I want to print the output as well to see if it works
        print(row)

    with open("connect.csv", "wb") as f:
        for row in B:
            writer = csv.writer(f)
            writer.writerow(B)  
错误是:

Traceback (most recent call last):
  File "txttocsv2.py", line 16, in <module>
    B[i,j] = w
  File "/home/osboxes/pymote_env/local/lib/python2.7/site-packages/scipy/sparse/lil.py", line 379, in __setitem__
    i, j, x)
  File "scipy/sparse/_csparsetools.pyx", line 231, in scipy.sparse._csparsetools.lil_fancy_set (scipy/sparse/_csparsetools.c:5041)
  File "scipy/sparse/_csparsetools.pyx", line 376, in scipy.sparse._csparsetools._lil_fancy_set_int32_float64 (scipy/sparse/_csparsetools.c:7021)
  File "scipy/sparse/_csparsetools.pyx", line 87, in scipy.sparse._csparsetools.lil_insert (scipy/sparse/_csparsetools.c:3216)
IndexError: column index (3) out of bounds  
回溯(最近一次呼叫最后一次):
文件“txttocsv2.py”,第16行,在
B[i,j]=w
文件“/home/osbox/pymote_env/local/lib/python2.7/site packages/scipy/sparse/lil.py”,第379行,在__
i、 j,x)
文件“scipy/sparse/_csparsetools.pyx”,第231行,在scipy.sparse._csparsetools.lil_fancy_集合中(scipy/sparse/_csparsetools.c:5041)
文件“scipy/sparse/_csparsetools.pyx”,第376行,在scipy.sparse.\u csparsetools.\u lil\u fancy\u set\u int32\u float64中(scipy/sparse/_csparsetools.c:7021)
文件“scipy/sparse/_csparsetools.pyx”,第87行,在scipy.sparse._csparsetools.lil_insert中(scipy/sparse/_csparsetools.c:3216)
索引器:列索引(3)超出范围
有谁能指出代码哪里出了问题并帮我解决吗?
提前感谢:)

使用Ubuntu14.04 32位虚拟机和Python 2.7,您的代码尝试访问matrix
B
中的位置
i,j
。 问题是
i
j
是基于一的,而矩阵是基于零的。 你应该切换到
B[i-1,j-1]=w
。另外,您可能需要将行
writer.writerow(B)
更改为
writer.writerow(行)

或者像约翰·高尔特所说的,使用熊猫
pivot

将熊猫作为pd导入


pd.read_csv('edge.txt',delimiter='',header=None).pivot(0,1,2).to_csv('connect.csv',header=False,index=False)

为什么不使用
df.pivot(0,1,2)
在pandas中创建矩阵,并使用
.to_csv(…)
保存为csv文件,其中
df
是edgelist?@JohnGalt感谢您的回复。我还是Python的初学者,因此理解您的答案对我来说有点困难。据我所知,您建议我使用
DataFrame
并创建矩阵,
pivot
中的
0、1、2
分别是边
u
v
和权重
w
,对吗?我该如何修改它以将文本文件作为输入?如果可能的话,请发布你的答案:)谢谢你的回答。代码使用的是
B[i-1,j-1]=w
,并且有一个输出,但是我在将输出写入CSV文件时仍然出错:
raise TypeError(“稀疏矩阵长度不明确;使用getnnz()”TypeError:稀疏矩阵长度不明确;使用getnnz()或shape[0]
错误指向行
writer.writerow(B)
。我无法从一开始就让它工作。如果可能,请发布完整的答案。再次感谢:)编辑。你能公布你在尝试使用pandas时遇到的错误吗?你对pandas的建议有效,但我仍然需要输出文件中的节点号作为适当的邻接矩阵。对此有什么建议吗?我现在有了节点号,我只需将
中的
标题和
索引更改为
。但是仍然存在一个问题,在输出的头中出现了一个
0
,就像
0,1,2,3
一样,在一个正确的CSV文件中实际应该是
,1,2,3
(第一个逗号前没有字符)。您可以像这样使用重命名轴:
pd.read\u CSV('edge.txt',delimiter='',header=None)。pivot(0,1,2)。将_轴(无)重命名为_csv('connect.csv',header=False,index=False)
Traceback (most recent call last):
  File "txttocsv2.py", line 16, in <module>
    B[i,j] = w
  File "/home/osboxes/pymote_env/local/lib/python2.7/site-packages/scipy/sparse/lil.py", line 379, in __setitem__
    i, j, x)
  File "scipy/sparse/_csparsetools.pyx", line 231, in scipy.sparse._csparsetools.lil_fancy_set (scipy/sparse/_csparsetools.c:5041)
  File "scipy/sparse/_csparsetools.pyx", line 376, in scipy.sparse._csparsetools._lil_fancy_set_int32_float64 (scipy/sparse/_csparsetools.c:7021)
  File "scipy/sparse/_csparsetools.pyx", line 87, in scipy.sparse._csparsetools.lil_insert (scipy/sparse/_csparsetools.c:3216)
IndexError: column index (3) out of bounds