2016-04-29 40 views
2

Ich habe eine Liste von 4 Listen, die den 4 Nukleotiden entsprechen (Liste 0 = A, Liste 1 = C, Liste 2 = G, Liste 3 = T. Jede Liste ist die gleiche Länge (repräsentiert Positionen in einer Sequenz). Die Elemente jeder Liste stellen die Frequenz dieses Nukleotids an dieser Position in der Sequenz über viele Sequenzen einer Datei dar (jede Liste hat die gleiche Länge wie die Sequenz). Hier ist ein Beispiel mit einfach zu arbeite mit Werten (tatsächlich habe ich lange Gleitkommawerte):Python Log2 über Index der Liste der Listen

[[0.0, 1.0, 2.0, 3.0, 4.0, 5.0], [0.1, 1.1, 2.1, 3.1, 4.1, 5.1], [0.2.1.2 2.2, 3.2, 4.2, 5.2], [0.3, 1.3, 2.3, 3.3, 4.3, 5.3]]

So zeigen diese Beispiele oben, dass die Sequenz co enthält 6 Nukleotide und in Position 0 beträgt die Häufigkeit von Nukleotid A 0,0. Die Häufigkeit von Nukleotid G (dargestellt durch die Liste an Position 2) an Position 2 ist 1,2. Ich möchte an jedem Element in einer bestimmten Position für jedes Nukleotid (jede Liste) eine mathematische Funktion ausführen und dann diese Werte summieren für diese Position allein (ICi). Wiederholen Sie dies für jede Position in der Liste und summieren Sie dann alle diese in einen Wert (IC). Unten ist der Code, background ist eine Liste der Länge 4 (Float-Werte), die ich in einer anderen Funktion berechnet habe und die für die mathematische Berechnung benötigt wird.

import math 
def function_name(lst, background): 
    ab, cb, gb, tb = background[0], background[1], background[2], background[3] 
    a, c, g, t = lst[0][:], lst[1][:], lst[2][:], lst[3][:] 
    pos = 0 
    IC = 0 
    for list in lst: 
     for i in list: 
      loga = math.log(((a[pos])/ab), 2) 
      logc = math.log(((c[pos])/cb), 2) 
      logg = math.log(((g[pos])/gb), 2) 
      logt = math.log(((t[pos])/tb), 2) 
      ICi = (a[pos]*loga + c[pos]*logc + g[pos]*logg + t[pos]*logt) 
      IC += ICi 
    return IC 

Im Folgenden finden Sie meine Daten für lst und Hintergrund als Testdaten:

lst = [[,011740473738414007, ,005561277033985582, ,5701338825952627, ,5069001029866117, 0,22183316168898043, ,24675592173017508, ,2947476828, 0,27394438722966014, 0,25458290422245106, ,2514933058702369], [,0014418125643666324 , ,02286302780638517, 0,07929969104016478, 0,13511843460350154, ,12461380020597322, 0,16416065911431513, ,17466529351184346, ,20844490216271885, 0,22265705458290422, ,22327497425334705], [0,9802265705458291, 0,003913491246138002, ,13347064881565396, 0,08, 0,43480947476828014, 0,13861997940267765, 0,14150360453141092, ,11987641606591143, 0,1167868 1771369721, ,11328527291452112], [,006591143151390319, ,9676622039134912, ,21709577754891865, ,2778578784757981, 0,21771369721936149, ,4490216271884655, 0,38722966014418125, ,3944387229660144, 0,40205973223480945, ,4074150360453141]]

background = [0,26125394569167243, ,1628634426694565, 0,17949426101679142, ,3891011102722321]

Aus diesen Daten, Ich sollte ein IC von ungefähr 4,74 bekommen, aber stattdessen komme ich um 91 ... Jede Hilfe, die Sie einem eifrigen, jungen Pythonschüler zur Verfügung stellen könnten, wäre wunderbar! Ich lerne immer noch, also versuche ich nicht, Werkzeuge wie numpy zu benutzen, ich muss lernen, wie man den Code mit eingebauten Programmen schreibt (wenn das Sinn macht). Vielen Dank im Voraus für Ihre Hilfe!

Antwort

0

Warum setzen Sie pos? Wo benutzt du ich? Ich verstehe nicht genau, was Sie zu tun versuchen; aber es sieht so aus, als ob Ihr Code exakt die gleiche Berechnung über das erste Element jeder Liste durchführt und das Ergebnis jedes Mal summiert, weil sich pos nicht ändert und ich (von Ihrer verschachtelten for-Schleife) nirgends verwendet wird. Das ist der Grund, warum das Ergebnis keinen Sinn ergibt.

Vermeiden Sie auch Namen von eingebauten Typen für Ihre Variablen (Liste); vielleicht Nukleotid oder etwas? Ersetzen Sie function_name durch etwas aussagekräftigeres wie logsum (oder was auch immer diese Zahl darstellt).

Wenn ich das versuche ich bekommen 4,41 (was näher ist, aber keine Zigarre ;-))

import math 
def function_name(lst, background): 
    ab, cb, gb, tb = background[0], background[1], background[2], background[3] 
    a, c, g, t = lst[0][:], lst[1][:], lst[2][:], lst[3][:] 
    pos = 0 
    IC = 0 
    for pos in range(len(a)): 
     loga = math.log(((a[pos])/ab), 2) 
     logc = math.log(((c[pos])/cb), 2) 
     logg = math.log(((g[pos])/gb), 2) 
     logt = math.log(((t[pos])/tb), 2) 
     ICi = (a[pos]*loga + c[pos]*logc + g[pos]*logg + t[pos]*logt) 
     IC += ICi 
    return IC 

hoffe das hilft dir ein wenig, um herauszufinden, was Sie brauchen ;-) Viel Glück!

+0

Ja! Sie sind ein Geschenk von Computer-Himmel;) Vielen Dank für Ihre Hilfe, ich konnte einfach nicht sehen, wo mein Problem war! – Ouwan12

1

Ich denke, Ihre for-Schleifen sind nicht zu tun, was Sie wollen:

pos = 0 
IC = 0 
for list in lst: 
    for i in list: 

Das erste Problem ist, dass Sie pos = 0 sind Einstellung und es innerhalb der Schleife, aber Sie es nie (dh erhöhen innerhalb der Schleife, die Sie nicht tun pos += 1. Das andere Problem ist, dass Sie Schleifen ohne Grund verschachteln. Denken Sie daran, was Ihr Code tut - for list in lst: bedeutet, dass Sie die äußere Schleife vier Mal, dann in jedem dieser, Sie Schleife über jedes Element und führe Aktionen für die Items in allen vier Listen aus. Kombiniert denke ich, dass du 4x die Anzahl der Loops machst, die du willst und innerhalb jeder Schleife du nehme immer den ersten Eintrag aus jeder Liste (da pos immer gleich 0 ist).

Ich denke, zu bekommen, was Sie wollen Sie so etwas wie tun müssen:

def function_name(lst, background): 
    ab, cb, gb, tb = background[0], background[1], background[2], background[3] 
    a, c, g, t = lst[0][:], lst[1][:], lst[2][:], lst[3][:] 
    pos = 0 
    IC = 0 

    for pos in range(len(a)): 
     loga = math.log(((a[pos])/ab), 2) 
     logc = math.log(((c[pos])/cb), 2) 
     logg = math.log(((g[pos])/gb), 2) 
     logt = math.log(((t[pos])/tb), 2) 
     ICi = (a[pos]*loga + c[pos]*logc + g[pos]*logg + t[pos]*logt) 
     IC += ICi 
    return IC 
+0

Ich sehe, vielen Dank für den Hinweis auf den Fehler, ich konnte es einfach nicht sehen! – Ouwan12