Python 使用numpy在基因组特征上随机分配DNA序列读取

Python 使用numpy在基因组特征上随机分配DNA序列读取,python,random,numpy,sequence,Python,Random,Numpy,Sequence,嗨,我已经写了一个脚本,随机地将读取的序列在它们被映射到的基因上移动。 如果你想确定在你感兴趣的基因上观察到的峰值是否具有统计学意义,这一点很有用。我用这段代码计算我感兴趣的基因峰值的错误发现率。 代码如下: import numpy as np import matplotlib.pyplot as plt iterations = 1000 # number of times a read needs to be shuffled featurelength = 1000 # length

嗨,我已经写了一个脚本,随机地将读取的序列在它们被映射到的基因上移动。 如果你想确定在你感兴趣的基因上观察到的峰值是否具有统计学意义,这一点很有用。我用这段代码计算我感兴趣的基因峰值的错误发现率。 代码如下:

import numpy as np
import matplotlib.pyplot as plt
iterations = 1000 # number of times a read needs to be shuffled
featurelength = 1000  # length of the gene
a = np.zeros((iterations,featurelength))  # create a matrix with 1000 rows of the feature length
b = np.arange(iterations)                 # a matrix with the number of iterations (0-999)
reads = np.random.randint(10,50,1000)     # a random dataset containing an array of DNA read lengths
以下代码填写大矩阵(a):

这将生成所需的结果,但由于for循环太多,因此速度非常慢。 我试着做一些有趣的numpy索引,但我经常会遇到“索引太多错误”


有人对如何做有更好的想法吗?

奇特的索引有点棘手,但仍然有可能:

for i in reads:
    r = np.random.randint(-i,featurelength-1,iterations)
    idx = np.clip(np.arange(i)[:,None]+r, 0, featurelength-1)
    a[b,idx] += 1
为了稍微解释一下,我们:

  • 创建一个简单的索引数组作为列向量,从0到i:
    np.arange(i)[:,None]

  • r
    (行向量)中的每个元素添加到
    a
    的列中,该行向量通过广播生成大小为
    (i,迭代)
    的矩阵,并具有正确的偏移量

  • 通过
    np.clip
    将索引夹紧到范围
    [0,featurelength)

  • 最后,我们为每行(
    b
    )和相关列(
    idx
    )创建索引
    a


  • 你能解释一下循环要做什么吗?例如,我不明白为什么你生成
    r
    ,然后只使用它的一个元素。你不能直接生成
    pos
    ?所以r有1000个随机数,它们本质上是读取I的随机起始位置。所以对于矩阵a中的第一行j,起始位置因为读起来是r[j]。我想做的是一次改变整个矩阵,但出于某种原因,numpy不允许我这么做。你能做的是:
    a[(j,pos)]+=1
    。你也可以做
    a[(j,tuple(range(pos,pos+1))]+=1
    。然而,当你对r中的所有随机位置这样做时:
    a[(j,tuple(range>)(pos,pos+i)),(j2,元组(范围(pos2,pos2+i)))]+=1
    ,等等,然后它会抱怨
    索引器、太多索引
    或其他一些我认为fancyindexing不支持按开始:结束数组进行切片,只支持按整数进行切片。我担心这会破坏任何进一步的向量化尝试。@eelcoogendoorn:只要用
    arange
    np.clip将开始:结束切片转换为整数数组即可更简洁。我的代码:1个循环,每个循环3:3.6秒最佳。perimosocordiae的代码:1个循环,每个循环3:1.14秒最佳。大约快3倍,产生完全相同的结果。谢谢!!!
    plt.imshow(a)
    plt.show()
    
    for i in reads:
        r = np.random.randint(-i,featurelength-1,iterations)
        idx = np.clip(np.arange(i)[:,None]+r, 0, featurelength-1)
        a[b,idx] += 1