从csv数据在python中创建邻接矩阵

2024-10-01 04:45:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下格式的数据:

eventid    mnbr
20         1
26         1
12         2
14         2
15         3
14         3
10         3

eventid是成员参加的事件数据表示为一个面板,以便您可以看到每个成员参加多个事件,多个成员可以参加同一个事件。我的目标是创建邻接矩阵:

^{pr2}$

当两个成员参加同一个活动时,有一个1。我成功地将csv文件的列读入两个独立的1D numpy数组。不过,接下来我不确定如何继续。如何最好地使用列2创建矩阵,以及随后如何使用列1来填充值?我知道我没有发布任何代码,也不希望在这方面有任何解决方案,但如果能有一个如何以有效方式解决问题的想法,我将不胜感激。我有大约300万个观察结果,所以创建太多的外部变量会有问题。提前谢谢。我收到一个通知,我的问题可能是重复的,但是我的问题是解析数据而不是创建邻接矩阵。在


Tags: 文件csv数据numpy面板目标格式事件
1条回答
网友
1楼 · 发布于 2024-10-01 04:45:20

这里有一个解决方案。它不直接给你所要求的邻接矩阵,但给你你自己创建它所需要的。在

#assume you stored every line of your input as a tuples (eventid, mnbr).
observations = [(20, 1), (26, 1), (12, 2), (14, 2), (15,3 ), (14, 3), (10, 3)]

#then creates an event link dictionary. i.e something that link every event to all its mnbrs
eventLinks = {}

for (eventid, mnbr) in observations :
    #If this event have never been encoutered then create a new entry in links
    if not eventid in eventLinks.keys():
        eventLinks[eventid] = []

    eventLinks[eventid].append(mnbr)

#collect the mnbrs
mnbrs = set([mnbr for (eventid, mnbr) in observations])

#create a member link dictionary. This one link a mnbr to other mnbr linked to it.
mnbrLinks = { mnbr : set() for mnbr in mnbrs }

for mnbrList in eventLinks.values() :
    #add for each mnbr all the mnbr implied in the same event.
    for mnbr in mnbrList:
        mnbrLinks[mnbr] = mnbrLinks[mnbr].union(set(mnbrList))

print(mnbrLinks)

执行此代码将得到以下结果:

^{pr2}$

这是一个字典,其中每个mnbr都有一组相关的邻接mnbrs。这实际上是一个邻接列表,它是一个压缩的邻接矩阵。您可以扩展它并使用字典键和值作为行和列索引来构建您所请求的矩阵。在

希望能有所帮助。 亚瑟。在

编辑:我提供了一种使用邻接列表的方法,让您实现自己的邻接矩阵构建。但您应该考虑真正使用这种数据结构,以防数据稀疏。见http://en.wikipedia.org/wiki/Adjacency_list

编辑2:添加一个代码来将adjacencyList转换为一个小的智能adjacencyMatrix

^{3}$

此代码给出以下结果:

mbr 1   2   3   
1   1   0   0   
2   0   1   1   
3   0   1   1   

m.areAdjacent(1,2) : False
m.areAdjacent(2,3) : True

相关问题 更多 >