python log2 超过列表列表的索引
python log2 over index of list of lists
我有一个包含 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.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 左右...如果您能为一个渴望的年轻 python 学生提供任何帮助,那就太好了!我还在学习,所以我不会尝试使用像 numpy 这样的工具,我需要学习如何使用内置函数编写代码(如果这有意义的话)。预先感谢您的帮助!
我认为您的 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 循环)没有在任何地方使用。这可能就是结果没有意义的原因。
同时避免为变量(列表)使用内置类型的名称;也许使用核苷酸什么的?将 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
希望这对您弄清楚您需要什么有所帮助;-)祝您好运!
我有一个包含 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.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 左右...如果您能为一个渴望的年轻 python 学生提供任何帮助,那就太好了!我还在学习,所以我不会尝试使用像 numpy 这样的工具,我需要学习如何使用内置函数编写代码(如果这有意义的话)。预先感谢您的帮助!
我认为您的 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 循环)没有在任何地方使用。这可能就是结果没有意义的原因。
同时避免为变量(列表)使用内置类型的名称;也许使用核苷酸什么的?将 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
希望这对您弄清楚您需要什么有所帮助;-)祝您好运!