列表索引上的python log2

2024-09-24 00:29:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)。下面是代码,背景是我在另一个函数中计算的长度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和背景数据:

lst=[[0.011740473738414007,0.005561277033985582,0.5701338825952627,0.5069001029866117,0.22183316168898043,0.2467592173017508,0.294768280123587,0.2739443872966014,0.25458290422245106,0.2514933058702369],[0.0014418125643666324,0.0228630780638517,0.079299104016478,0.13511843460350154,0.124613800205972,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.2170957754891865、0.2778578784757981、0.2177136149、0.4490216271884655、0.3872966014418125、0.394438729660144、0.4020597223480945、0.4074150360453141]]

背景=[0.26125394569167243,0.1628634426694565,0.17949426101679142,0.3891011102722321]

从这个数据来看,我应该得到一个4.74左右的IC,但是我得到的却是91左右……任何你能为一个渴望学习python的年轻学生提供的帮助都是非常好的!我还在学习,所以我不想使用像numpy这样的工具,我需要学习如何使用内置程序编写代码(如果这有意义的话)。提前感谢您的帮助!你知道吗


Tags: 函数poslog元素列表序列math频率
2条回答

我认为你的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

为什么要设置pos?你在哪里用我?我不太明白你到底想做什么,但似乎你的代码对每个列表的第一个元素做了完全相同的计算,每次都对结果求和,因为pos没有改变,而I(来自嵌套for循环)在任何地方都没有使用。这也许就是为什么结果没有意义。你知道吗

也要避免在变量(列表)中使用内置类型的名称;或者使用核苷酸什么的?将函数名替换为更具描述性的名称,如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

希望这能帮你弄清楚你需要什么;—)祝你好运!你知道吗

相关问题 更多 >