Matrix erstellen

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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
Ich benötige eine Matrix die wie folgt definiert https://github.com/d3/d3-chord ist:
Computes the chord layout for the specified square matrix of size n×n, where the matrix represents the directed flow amongst a network (a complete digraph) of n nodes. The given matrix must be an array of length n, where each element matrix is an array of n numbers, where each matrix[j] represents the flow from the ith node in the network to the jth node. Each number matrix[j] must be nonnegative, though it can be zero if there is no flow from node i to node j.

Code: Alles auswählen

var matrix = [
  [11975,  5871, 8916, 2868],
  [ 1951, 10048, 2060, 6171],
  [ 8010, 16145, 8090, 8045],
  [ 1013,   990,  940, 6907]
];
und grafisch wie folgt aussieht:

Bild

Ich habe folgende Eingabedatei:

Code: Alles auswählen

tig00007144	chr03	1	5	1	5
tig00026480	chr03	10	15	10	15
tig00003221	chr03	7	9	12	14
tig00010111	chr03	9	12	17	20
tig00000318	chr03	15	20	15	20


Und die Matrix wurde wahrscheinlich wie folgt aussehen:
Bild
Die leeren Matrix Felder müssten mit Null gefüllt werden.

Im Moment habe ich diesen Code geschrieben:

Code: Alles auswählen

from collections import OrderedDict
import json
import numpy


def create_matrix(filename, assembly_len, reference_len):
    dimension = 0
    if (assembly_len > reference_len) or (assembly_len == reference_len):
        dimension = assembly_len
    else:
        dimension = reference_len

    matrix = numpy.zeros(shape=(dimension,dimension))
    print matrix

    with open(filename) as f:
        for line in f:
            try:
                parts = line.rstrip().split('\t')
                query_name = parts[0]
                subject_name = parts[1]
                query_start = int(parts[2])
                query_end = int(parts[3])
                subject_start = int(parts[4])
                subject_end = int(parts[5])

                query_elements = range(query_start -1, query_end)
                subject_elements = range(subject_start -1, subject_end)

                print query_elements
                print subject_elements

            except ValueError:
                pass

if __name__ == "__main__":
    assembly_len = 20
    reference_len = 30

    create_matrix('blast_test', assembly_len, reference_len)
Wie könnte man am besten die Information aus der oberen Tabelle in die Matrix einfügen?

Vielen Dank im Voraus.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@mit: bevor Du nach der besten Lösung fragst, solltest Du Dir erst überlegen, wie man die Matrix irgendwie füllen kann. Wie übersetzen sich `query_start`, `query_end`, `subject_start` und `subject_end` in Zellen?

Für `if`-Abfragen braucht man keine Klammern und das `or` könnte man besser als >= schreiben. In Wirklichkeit hast Du da aber nur die max-Funktion nachprogrammiert. try-Blöcke sollten so kurz wie möglich sein, in welchen Zeilen erwartest Du also einen ValueError? Und sollte man den wirklich ignorieren? Viel wahrscheinlicher ist ein IndexError.
Antworten