Hi liebe Python-comunity:
ich hätte eine kleine frage zum einlesen von Daten. Ich programmiere Hauptsächlich mit R und komme daher nicht ganz klar mit dem einlesen von Daten in Python.
Konkrete arbeite ich mit dem Networkz package und versuche stp Daten die einen Graphen darstellen einzulesen. Jedoch gelingt es mir nicht die daten richtig weiterverarbeiten zu können.
Daher meine Frage: gibt es eine Möglichkeit die Daten so einzulesen das ich ein Adjazenzmatrix bekomme. Anbei findet ihr ein Link wie die Daten aussehen.
http://steinlib.zib.de/download.php
Vielen dank schon mal im Vorraus,
Servus
.stp daten einlesen
-
BlackJack
@schrabauke: Der Link wie die Daten aussehen wäre wohl eher: http://steinlib.zib.de/format.php
Eine Formatbeschreibung gibt in der Regel mehr her als Beispiele bei denen man nicht weiss ob bestimmte Eigenschaften nur Zufällig in dem Beispiel so sind, oder ob sie so sein *müssen*.
Die Antwort zur Frage ist einfach: Ja es gibt eine Möglichkeit aus den Daten eine Adjazenzmatrix zu erzeugen.
Hast Du das Tutorial in der Python-Dokumentation schon mal durchgearbeitet? Wo liegen denn die konkreten Probleme?
Edit: Was ist denn das *eigentliche* Ziel? Willst Du ein `networkx`-Graph-Objekt oder wirklich eine Adjazenzmatrix haben? Nur für die Matrix braucht man `networkx` nicht zwingend, und wenn man ein Graph-Objekt haben möchte, scheint mir die Matrix ein Umweg zu sein, denn dann kann man statt erst eine Matrix zu erstellen und daraus ein Graph-Objekt zu erzeugen auch gleich das Graph-Objekt aus den Daten aufbauen.
Eine Formatbeschreibung gibt in der Regel mehr her als Beispiele bei denen man nicht weiss ob bestimmte Eigenschaften nur Zufällig in dem Beispiel so sind, oder ob sie so sein *müssen*.
Die Antwort zur Frage ist einfach: Ja es gibt eine Möglichkeit aus den Daten eine Adjazenzmatrix zu erzeugen.
Hast Du das Tutorial in der Python-Dokumentation schon mal durchgearbeitet? Wo liegen denn die konkreten Probleme?
Edit: Was ist denn das *eigentliche* Ziel? Willst Du ein `networkx`-Graph-Objekt oder wirklich eine Adjazenzmatrix haben? Nur für die Matrix braucht man `networkx` nicht zwingend, und wenn man ein Graph-Objekt haben möchte, scheint mir die Matrix ein Umweg zu sein, denn dann kann man statt erst eine Matrix zu erstellen und daraus ein Graph-Objekt zu erzeugen auch gleich das Graph-Objekt aus den Daten aufbauen.
-
schrabauke
- User
- Beiträge: 2
- Registriert: Freitag 1. Juni 2012, 09:58
Ja danke mal für die Antwort,
nein ich benötige nicht nur die Matirx grundsätzlich geht es darum einen Steiner tree zu analysieren. Ich werd mich jetzt mal an dem Tutorial versuchen und hoffe das ich so recht schnell auf meinen gwünschte Form komme um mit meiner auswertung zu beginnen.
Servus Bernd
nein ich benötige nicht nur die Matirx grundsätzlich geht es darum einen Steiner tree zu analysieren. Ich werd mich jetzt mal an dem Tutorial versuchen und hoffe das ich so recht schnell auf meinen gwünschte Form komme um mit meiner auswertung zu beginnen.
Servus Bernd
-
BlackJack
Gerade in einem noch offenen Editor gefunden — wollte ich eigentlich früher posten.
Ausgabe für das Beispiel aus der Formatbeschreibung:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from itertools import dropwhile, imap, takewhile
from pprint import pprint
from networkx import DiGraph, Graph, to_dict_of_dicts, to_numpy_matrix
EDGETYPE_TO_GRAPH = { 'Edges': Graph, 'Arcs': DiGraph }
def parse_stp(lines):
"""Parses the *Graph* section from given iterable of lines and returns
an :class:`networkx.Graph` or :class:`networkx.DiGraph` instance, depending
on the type of graph in that section.
All other section in the STP file lines are ignored.
"""
#
# Just process the Graph section. Including the header, excluding the END.
#
lines = takewhile(
lambda s: s != 'END\n',
dropwhile(lambda s: not s.startswith('SECTION Graph'), lines)
)
#
# Skip SECTION line.
#
next(lines)
nodes, node_count = next(lines).split()
assert nodes == 'Nodes'
node_count = int(node_count)
edge_type, edge_count = next(lines).split()
edge_count = int(edge_count)
result = EDGETYPE_TO_GRAPH[edge_type]()
result.add_nodes_from(xrange(1, node_count + 1))
def parse_edge(line):
parts = line.split()
assert len(parts) == 4 and parts[0] == edge_type[0]
return map(int, parts[1:])
result.add_edges_from(imap(parse_edge, lines))
assert (
result.number_of_nodes() == node_count
and result.number_of_edges() == edge_count
)
return result
def main():
with open('test.stp') as lines:
graph = parse_stp(lines)
pprint(to_dict_of_dicts(graph))
print to_numpy_matrix(graph)
if __name__ == '__main__':
main()Code: Alles auswählen
{1: {2: 1, 4: 1, 6: 1},
2: {1: 1, 3: 1, 7: 1},
3: {2: 1, 4: 1},
4: {1: 1, 3: 1, 5: 1},
5: {4: 1, 6: 1},
6: {1: 1, 5: 1, 7: 1},
7: {2: 1, 6: 1}}
[[ 0. 1. 0. 1. 0. 1. 0.]
[ 1. 0. 1. 0. 0. 0. 1.]
[ 0. 1. 0. 1. 0. 0. 0.]
[ 1. 0. 1. 0. 1. 0. 0.]
[ 0. 0. 0. 1. 0. 1. 0.]
[ 1. 0. 0. 0. 1. 0. 1.]
[ 0. 1. 0. 0. 0. 1. 0.]]