生信自学笔记(七)Smith Waterman算法的 python 实现

和上一回的算法相比,这是一个更加注重局部比对的算法,返回的是一段对比度最高的序列。其最精彩之处就在于引入了0这一可能,这样在任何时候,序列比较都能从当前位置从头开始,从而实现局部性。

为了能更有效率地完成回溯,在给矩阵打分时将打分结果记录在了几个数组中,并且在回溯时使用这几个数组加速过程。

这次写又掌握了numpy的许多新功能,比如zip、around、arange等等。具体用法可以看下面的代码。其中L矩阵是直接比对的情况,P是对seq2加空格比对的情况,Q是对seq1加空格比对的情况。

 

import numpy as np

# 对任意两个字符进行比较
def compare(m, n, match, n_match):
    if m == n:
        return match
    else:
        return n_match

#构建打分矩阵
def mark(seq1, seq2, match, n_match, v, u):
    "用来生成最终的打分矩阵,传入形参分别为两个序列和匹配罚分、错配罚分、空位设置罚值,空位扩展罚值(出现空位的罚值为v+u*k)"
    a = len(seq1)
    b = len(seq2)
    # 初始化打分矩阵
    S = np.zeros((a + 1, b + 1))
    # 顺序匹配的情况
    L = np.zeros((a + 1, b + 1))
    # 序列1产生若干空位情况
    P = np.zeros((a + 1, b + 1))
    # 序列2产生若干空位情况
    Q = 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羊城迷鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值