首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python numpy高效组合数组

Python numpy高效组合数组
EN

Stack Overflow用户
提问于 2014-03-17 12:15:29
回答 1查看 234关注 0票数 0

我的问题可能听起来很重生物学,但我相信任何人都可以在没有任何生物学知识的情况下回答这个问题,我真的需要一些帮助。

假设您有一个函数create_offspring(突变,genome1,genome2),它接受一系列突变,这些突变是具有5行10列的numpy 2d数组的形式(每组5个突变是一个突变):

代码语言:javascript
复制
    [ [4, 3, 6 , 7, 8], [5, 2, 6 , 7, 8] ...]

该函数还采用两个基因组,它们是具有5行10列的numpy 2d阵列的形式。基因组中每个位置的值要么是没有发生突变的地方的5个零,要么是对应于突变发生的点的突变列表的值。下面是一个基因组的例子,该基因组在位置0还没有突变,但在位置1已经有了突变。

代码语言:javascript
复制
    [ [0, 0, 0 , 0, 0], [5, 2, 5 , 7, 8] ...]

我试图完成的是高效地(我有一种有效的方法,但它是缓慢的)从我的两个基因组中生成子基因组,这是一个numpy数组和两个父基因组的随机组合(也称为numpy数组)。通过随机组合,我的意思是,子数组中的每个位置都有50%的机会是来自父1基因组或父2的位置X的5个值。

代码语言:javascript
复制
[0,0,0,0,0], [5, 2, 6 , 7, 8] ...]

而家长2是

代码语言:javascript
复制
[ [4, 3, 6 , 7, 8], [0, 0, 0 , 0, 0] ...]

儿童基因组应该有50%的机会在位置1获得全零,有50%的机会获得[4, 3, 6 , 7, 8]等。

此外,还需要有一个.01%机会,即子基因组从最初传入的突变列表中获得相应的突变。

我现在有一个解决这个问题的方法,但它花费的时间太长了:

代码语言:javascript
复制
    def create_offspring(mutations, genome_1, genome_2 ):
        ##creates an empty genome
        child_genome = numpy.array([[0]*5] * 10, dtype=np.float)
        for val in range(10):
            random = rand()
            if random < mutation_rate:
                child_genome[val] = mutation_list[val]
            elif random > .5:
                child_genome[val] = genome1[val]
            else:
                child_genome[val] = genome2[val]

        return child_genome
EN

回答 1

Stack Overflow用户

发布于 2014-03-17 12:42:21

感谢你在评论中的澄清。10000和10的工作方式不同:)

首先,有一种更快的方法来创建一个空(或满)数组:

代码语言:javascript
复制
np.zeros(shape=(rows, cols), dtype=np.float)

然后,尝试生成一个随机数列表,同时检查每个随机数,然后从那里开始工作。

代码语言:javascript
复制
randoms = np.rand(len(genome))
half = (randoms < .5)

for val, (rand, half) in enumerate(zip(randoms, half)):
      your_code

这至少会加速随机数的生成。我还在考虑剩下的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22446857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档