首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进化生物学中的模拟--太多的循环?

进化生物学中的模拟--太多的循环?
EN

Stack Overflow用户
提问于 2017-05-08 00:54:43
回答 1查看 58关注 0票数 0

当时,我成功地为我需要做的工作编写了模拟代码。然而,我对python还是个新手。因此,我现在正在使模拟更有效率。例如:

代码语言:javascript
复制
if random.random() < mm:
    z = numpy.random.choice(pat)

    if random.random() < 0.5:
        if random.random() < mut:
            if maleadult[z][0] == 0:
                malejuv[y][x][0] = 1
            elif maleadult[z][0] == 1:
                malejuv[y][x][0] = 0
        else:
            malejuv[y][x][0] = maleadult[z][0]
    else:
        if random.random() < mut:
            if femaleadult[z][0] == 0:
                malejuv[y][x][0] = 1
            elif femaleadult[z][0] == 1:
                malejuv[y][x][0] = 0
        else:
            malejuv[y][x][0] = femaleadult[z][0]

    if random.random() < 0.5:
        if random.random() < mut:
            if maleadult[z][1] == 0:
                malejuv[y][x][1] = 1
            elif maleadult[z][1] == 1:
                malejuv[y][x][1] = 0
        else:
            malejuv[y][x][1] = maleadult[z][1]
    else:
        if random.random() < mut:
            if femaleadult[z][1] == 0:
                malejuv[y][x][1] = 1
            elif femaleadult[z][1] == 1:
                malejuv[y][x][1] = 0
        else:
            malejuv[y][x][1] = femaleadult[z][0]

其中:

代码语言:javascript
复制
 mm - male dispersal, 
 mf - female dispersal, 
 mut - mutations, 
 pat - patch, 
 maleadult - adult male, 
 femaleadult - adult female, 
 malejuv - juvenile male, 
 femalejuv - juvenile female. 

如您所见,代码很大。这只适用于雄性,当它们散开的时候。代码的其余部分非常相似。这些都是标准的遗传和人口统计过程--但我觉得这是可以改进的。我觉得这些过程很简单,所以可能没有必要编写这么大的代码。

有没有人有任何想法来缩短这段时间,从而使其更有效率?

EN

回答 1

Stack Overflow用户

发布于 2017-05-08 01:13:03

您的示例没有任何循环,但看起来可以简化一个:

代码语言:javascript
复制
if random.random() < mm:
    z = numpy.random.choice(pat)

    for i in range(2):

        if random.random() < 0.5:
            if random.random() < mut:
                if maleadult[z][i] == 0:
                    malejuv[y][x][i] = 1
                elif maleadult[z][i] == 1:
                    malejuv[y][x][i] = 0
            else:
                malejuv[y][x][i] = maleadult[z][i]
        else:
            if random.random() < mut:
                if femaleadult[z][i] == 0:
                    malejuv[y][x][i] = 1
                elif femaleadult[z][i] == 1:
                    malejuv[y][x][i] = 0
            else:
                malejuv[y][x][i] = femaleadult[z][i]

还可以对其进行修改的pass a mutable object as reference to a function,这允许进一步减少几乎冗余的代码。我添加了一些数据来测试它:

代码语言:javascript
复制
#!python3
#coding=utf-8

import random

maleadult = [[["male adult"], ["another male adult"], ]]
femaleadult = [[["female adult"], ["another female adult"], ]]
malejuv =   [[[["male juv"],["another male juv"]]]]

mut = 0.5
mm = 1.0
x = 0
y = 0
z = 0


def some_logic(a, j):
    """ does something """
    if random.random() < mut:
        if a[z][i] == 0:
            j[y][x][i] = 1
        elif a[z][i] == 1:
            j[y][x][i] = 0
        # added!
        else:
            j[y][x][i] = 0
    else:
        j[y][x][i] = a[z][i]


if random.random() < mm:
    z = 0 #numpy.random.choice(pat)
    for i in range(2):
        print(i)
        if random.random() < 0.5:
            some_logic(maleadult, malejuv)
        else:
            some_logic(femaleadult, malejuv)

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

https://stackoverflow.com/questions/43834164

复制
相关文章

相似问题

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