我有4个列表对应4个核苷酸的列表(列表0 = A,列表1 = C,列表2 = G,列表3 = T.每个列表长度相同(表示序列中的位置)每个列表的元素表示序列中该位置的核苷酸在文件的许多序列中的频率(每个列表与序列的长度相同)。这里是一个易于使用值的示例(实际上我有很长的浮动值):
[[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]]
因此,上述这些实施例表明该序列含有6个核苷酸,而在0位,核苷酸A的频率为0.0。第2位的核苷酸G的频率(由位置2的列表表示)为1.2
我想对每个核苷酸(每个列表)的特定位置的每个元素执行数学函数,然后仅对该位置的那些值求和(ICi)。然后对列表中的每个位置重复此操作,最后将所有这些值合并为一个值(IC)。下面是代码,background是我在另一个函数中计算的长度为4(浮点值)的列表,需要进行数学计算。
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
以下是我的第一和背景数据作为测试数据:
LST = [[0.011740473738414007,0.005561277033985582,0.5701338825952627,0.5069001029866117,0.22183316168898043,0.24675592173017508,0.29474768280123587,0.27394438722966014,0.25458290422245106,0.2514933058702369],[0.0014418125643666324,0.02286302780638517,0.07929969104016478,0.13511843460350154,0.12461380020597322,0.16416065911431513,0.17466529351184346,0.20844490216271885,0.22265705458290422,0.22327497425334705] [0.9802265705458291,0.003913491246138002,0.13347064881565396,0.08012358393408857,0.43480947476828014,0.13861997940267765,0.14150360453141092,0.11987641606591143,0.11678681771369721,0.11328527291452112],[0.006591143151390319,0.9676622039134912,0.21709577754891865,0.2778578784757981,0.21771369721936149,0.4490216271884655,0.38722966014418125,0.3944387229660144,0.40205973223480945,0.4074150360453141]]
背景= [0.26125394569167243,0.1628634426694565,0.17949426101679142,0.3891011102722321]
根据这些数据,我应该得到一个大约4.74的IC,但是我得到了大约91 ...任何帮助你可以提供一个渴望,年轻的蟒蛇学生将是美好的!我还在学习,所以我没有尝试使用像numpy这样的工具,我需要学习如何使用内置函数编写代码(如果这样做有意义)。提前感谢您的帮助!
答案 0 :(得分:1)
我认为你的for循环没有做你想做的事情:
pos = 0
IC = 0
for list in lst:
for i in list:
第一个问题是你正在设置pos = 0
并在循环中使用它,但是你永远不会增加它(即在循环内你不做pos += 1
。另一个问题是你无缘无故地嵌套循环。想想你的代码做了什么 - for list in lst:
意味着你做了四次外循环;然后在每个循环中,你遍历每个项目并对项目执行操作在所有四个列表中。组合我认为这意味着你所做的循环次数是你需要的4倍,并且在每个循环中你总是抓住每个列表中的第一个项目(因为pos
始终是等于0)。
我想要得到你想要的东西,比如:
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
答案 1 :(得分:0)
你为什么设置pos?你在哪里使用我?我不明白你想要做什么;但似乎你的代码在每个列表的第一个元素上进行完全相同的计算,每次总结结果,因为pos不会改变,并且i(来自嵌套的for循环)不会在任何地方使用。这可能就是结果没有意义的原因。
还要避免为变量使用内置类型的名称(列表);也许使用核苷酸或什么?将function_name替换为更具描述性的内容,例如logsum(或该数字代表的任何内容)。
如果我尝试这个,我会得到4.41(更接近但没有雪茄;-))
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
希望这可以帮助你找到你需要的东西;-)祝你好运!