Python:细菌生长模型、嵌套 while 循环、逻辑错误

标签 python while-loop

我必须将细菌生长建模为光密度的函数。问题很简单:用户每指定一个小时,表格中每个单元格的 OD 就会增加 5%;当细胞的OD达到1.0时,多余的部分分配给溢出细胞的N、E、S和W细胞。如果它们都为 1.0,则不再发生增长。 OD 表是正方形的,可以是任何尺寸,它不会环绕。

在下面的代码中:

array3 是 OD 的初始表,长度是行数和列数。我知道我在嵌套 while 循环中犯了一个逻辑错误,因为只有第一行更新,而且只有一次:

elapsed=0
i=0
j=0
hours = input('how many hours do you want to run the experiment for?\n')
increase = 1.05

while elapsed <= hours:
    while i<length:
        while j<length:
            if array3[i, j]<1.0:
                array3[i, j]*=increase
                j+=1
            if array3[i, j]>=1.0:
                array3[i, j]=1.0
                excess=((array3[i, j]*increase)-1)/4
                array3[(i-1), j]+=excess
                array3[(i+1), j]+=excess
                array3[i, (j-1)]+=excess
                array3[i, (j+1)]+=excess
                j+=1
        i+=1
    elapsed+=1

最佳答案

正如评论中已经指出的,问题在于您增加了循环中的计数器变量,但在下一次迭代之前没有将它们重置为原始值。添加i = 0就在while i<length之前(与 j 类似)可以解决您的问题,但我建议使用 for相反,循环遍历 range变量应采用的值。

for elapsed in range(hours):
    for i, j in itertools.product(range(length), repeat=2):
        if array3[i, j] < 1.0:
            array3[i, j] = min(1.0, array3[i, j] * increase)
        else:
            excess = ((array3[i, j] * increase) - 1) / 4
            for di, dj in [(+1,0), (-1,0), (0,+1), (0,-1)]:
                if 0 <= i+di < length and 0 <= j+dj < length:
                    array3[i+di, j+dj] = min(1.0, array3[i+di, j+dj] + excess)

如您所见,我做了一些更改:

  • itertools 非常有用,例如用于迭代两个变量的乘积,例如 ij
  • 您可以使用min内置函数将增长限制在 1.0
  • 循环遍历 i 的所有“增量”和j而不是为所有 4 个邻居使用相同的代码

关于Python:细菌生长模型、嵌套 while 循环、逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24454991/

相关文章:

python - 在 Rasterio 中 - 当仿射对象是单独的时,如何平铺表示地理引用图像的数组?

Python 处理 TypeError :

python - while循环中的条件语句不执行其下的所有内容

python - 如何为Python指定虚拟环境

python - 不同数据类型相互转换

Python distutils,如何获得将要使用的编译器?

linux - 在 bash while 循环中暂停

php - 数据库输出未显示。获取 else 语句

linux - 如何使用 xargs max-procs 实用程序并行多次调用 while 语句

c - 当 fscanf 从文本文件读取特定值时结束循环