python - 无需替换即可生成 numpy.random.choice 的二维数组

标签 python arrays numpy random vectorization

我试图通过删除一些 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/

相关文章:

java - 将元素添加到数组时,对象数组未初始化新对象

javascript - 如何根据一个数组中的值设置复选框选中状态,并在选中时将值添加到另一个数组,否则使用 Angular js 删除?

python - 用于处理多元多项式的库

python - 从 1 维数据 reshape 生成 4 维数组

arrays - 使用掩码数组创建 pandas DataFrame

python - “元组”对象没有属性 'rstrip'

python - UDP 连接没有收到来自服务器的任何回复 - Python(也可能使用 boost 的 C++)

python - 如何在Python中获取numpy数组的真实维度?

javascript - 'style ="border:none; overflow:hidden; height:80px"' 通过 python re.sub 到 js 对象

从长路径提取文件时 Windows 上的 Python Zipfile extractall IOError