2009-12-21 41 views
7

Tôi có tệp csv lớn liệt kê các kết nối giữa các nút trong biểu đồ. Ví dụ:csv vào ma trận thưa thớt trong python

0001,95784
0001,98743
0002,00082
0002,00091

Vì vậy, điều này có nghĩa rằng nút id 0001 được kết nối đến nút 95.784 và 98.743 và vân vân. Tôi cần phải đọc điều này vào một ma trận thưa thớt trong numpy. Tôi có thể làm cái này như thế nào? Tôi mới dùng python để hướng dẫn về điều này cũng sẽ hữu ích.

+0

Ý anh là gì bởi '0001 được kết nối với 95.784', trong các điều khoản của ma trận bạn muốn có? – kender

+0

Bằng cách này, tôi có nghĩa là nút (id: 0001) có một liên kết hướng tới nút (id: 95784) –

Trả lời

10

Ví dụ sử dụng lil_matrix (danh sách các ma trận list) của scipy.

Ma trận danh sách liên kết dựa trên hàng.

Điều này chứa danh sách (self.rows) của các hàng, mỗi hàng là một danh sách được sắp xếp các chỉ mục cột của các phần tử khác 0. Nó cũng chứa một danh sách (self.data) của danh sách các yếu tố này.

$ cat 1938894-simplified.csv 
0,32 
1,21 
1,23 
1,32 
2,23 
2,53 
2,82 
3,82 
4,46 
5,75 
7,86 
8,28 

Code:

#!/usr/bin/env python 

import csv 
from scipy import sparse 

rows, columns = 10, 100 
matrix = sparse.lil_matrix((rows, columns)) 

csvreader = csv.reader(open('1938894-simplified.csv')) 
for line in csvreader: 
    row, column = map(int, line) 
    matrix.data[row].append(column) 

print matrix.data 

Output:

[[32] [21, 23, 32] [23, 53, 82] [82] [46] [75] [] [86] [28] []] 
+0

Chính xác những gì tôi cần. Bất kỳ nguồn lực tốt cho scipy mà bạn có thể đề nghị? –

+0

tôi đoán http://docs.scipy.org/doc/ sẽ là điểm bắt đầu .. – miku

+0

Một câu hỏi nhỏ. Các số trong csv không phải là chỉ mục. họ Id tức là tập tin bắt đầu với 0001001,9304045 0001001,9308122 0001001,9309097 0001001,9311042 0001001,9401139 0001001,9404151 0001001,9407087 0001001,9408099 0001001,9501030 0001001,9503124 Vì vậy, làm cách nào để chuyển đổi các ID này thành chỉ mục số, máy chủ ID có mục đích chỉ là các nút xác định, chúng có thể được thay thế bằng các chỉ mục tương đương nếu chúng là duy nhất. Làm cách nào để thực hiện việc này. Tôi biết tôi chỉ có thể làm cho hàng và cột lớn như ID lớn nhất nhưng điều đó có vẻ lãng phí vì các nút như với chỉ số 0 - 1001 bị lãng phí. –

1

Nếu bạn muốn một ma trận kề, bạn có thể làm điều gì đó như:

from scipy.sparse import * 
from scipy import * 
from numpy import * 
import csv 
S = dok_matrix((10000,10000), dtype=bool) 
f = open("your_file_name") 
reader = csv.reader(f) 
for line in reader: 
    S[int(line[0]),int(line[1])] = True 
1

Bạn cũng có thể quan tâm Networkx, một mạng lưới trăn tinh khiết/gói đồ họa.

Từ trang web:

NetworkX là một gói Python cho việc tạo ra, thao tác, và nghiên cứu về cấu trúc, năng động, và chức năng của mạng phức tạp.

>>> import networkx as nx 
>>> G=nx.Graph() 
>>> G.add_edge(1,2) 
>>> G.add_node("spam") 
>>> print G.nodes() 
[1, 2, 'spam'] 
>>> print G.edges() 
[(1, 2)] 
Các vấn đề liên quan