我试图通过删除一些 for 循环和使用数组来使我的代码更快。现在最慢的步骤是随机列表的生成。
上下文:我在染色体中有许多突变,我想执行 1000 个具有相同长度和相同突变数量的随机“染色体”,但它们的位置是随机的。
这是我目前正在运行的生成这些随机突变位置的方法:
iterations=1000
Chr_size=1000000
num_mut=500
randbps=[]
for k in range(iterations):
listed=np.random.choice(range(Chr_size),num_mut,replace=False)
randbps.append(listed)
我想做一些类似于他们在 this question 中介绍的事情
np.random.choice(range(Chr_size),size=(num_mut,iterations),replace=False)
但是没有替换适用于整个数组。
更多上下文:稍后在脚本中我遍历每个随机染色体并计算给定窗口中的突变数量:
for l in range(len(randbps)):
arr=np.asarray(randbps[l])
for i in range(chr_last_window[f])[::step]:
counter=((i < arr) & (arr < i+window)).sum()
最佳答案
我不知道 np.random.choice 是如何实现的,但我猜它针对一般情况进行了优化。另一方面,您的数字不太可能产生相同的序列。对于这种情况,集合可能更有效,从头开始构建:
import random
def gen_2d(iterations, Chr_size, num_mut):
randbps = set()
while len(randbps) < iterations:
listed = set()
while len(listed) < num_mut:
listed.add(random.choice(range(Chr_size)))
randbps.add(tuple(sorted(listed)))
return np.array(list(randbps))
此函数从一个空集开始,生成范围 (Chr_size) 内的单个数字并将该数字添加到该集。由于集合的属性,它不能再次添加相同的数字。它对 randbps 也做同样的事情,所以 randbps 的每个元素也是唯一的。
仅 np.random.choice 与 gen_2d 的一次迭代:
iterations=1000
Chr_size=1000000
num_mut=500
%timeit np.random.choice(range(Chr_size),num_mut,replace=False)
10 loops, best of 3: 141 ms per loop
%timeit gen_2d(1, Chr_size, num_mut)
1000 loops, best of 3: 647 µs per loop
关于python - 无需替换即可生成 numpy.random.choice 的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37012244/