frazman
frazman

Reputation: 33243

Python - convert edge list to adjacency matrix

I have data in the following format:

user,item,rating
1,1,3
1,2,2
2,1,2
2,4,1

and so on I want to convert this in matrix form

So, the out put is like this

Item--> 1,2,3,4....
user
1       3,2,0,0....
2       2,0,0,1

....and so on..

How do I do this in python?

THanks

Upvotes: 1

Views: 7574

Answers (2)

falsetru
falsetru

Reputation: 369074

data = [
    (1,1,3),
    (1,2,2),
    (2,1,2),
    (2,4,1),
]

#import csv
#with open('data.csv') as f:
#    next(f) # Skip header
#    data = [map(int, row) for row in csv.reader(f)]
#    # Python 3.x: map(int, row) -> tuple(map(int, row))

n = max(max(user, item) for user, item, rating in data) # Get size of matrix
matrix = np.zeros((n, n))
for user, item, rating in data:
    matrix[user-1][item-1] = rating # Convert to 0-based index.

for row in matrix:
    print(row)

prints

[3, 2, 0, 0]
[2, 0, 0, 1]
[0, 0, 0, 0]
[0, 0, 0, 0]

Upvotes: 2

Ananta
Ananta

Reputation: 3711

a different approach from @falsetru,

do you read from file in write to file?

may be work with dictionary

from collections import defaultdict
valdict=defaultdict(int)
nuser=0
nitem=0
for line in infile:
    eachline=line.strip().split(",")
    valdict[tuple(eachline[0:2])]=eachline[2]
    nuser=max(nuser,eachline[0])
    nitem=max(nitem,eachline[1])

towrite=",".join(range(1,nuser+1))+"\n"
for i in range(1:nuser+1):
    towrite+=str(i)
    for j in range(1:nitem+1):
        towrite+=","+str(valdict[i,j])
    towrite+="\n"

outfile.write(towrite)

Upvotes: 1

Related Questions