.stp daten einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
schrabauke
User
Beiträge: 2
Registriert: Freitag 1. Juni 2012, 09:58

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
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.
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
BlackJack

Gerade in einem noch offenen Editor gefunden — wollte ich eigentlich früher posten. :oops:

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()
Ausgabe für das Beispiel aus der Formatbeschreibung:

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.]]
Antworten