首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LIfe游戏:用条件迭代时修改numpy中的数组值

LIfe游戏:用条件迭代时修改numpy中的数组值
EN

Stack Overflow用户
提问于 2016-11-08 18:20:07
回答 1查看 805关注 0票数 0

我是一名物理专业的学生,对Python有着非常基本的了解,我一直在试图寻找一个简单的解决这个问题的方法,但我只是在兜圈子。我正在为一个名为“生命的游戏”(WikiPage)的节目写我自己的表演。这些规则很简单:

游戏由所谓的细胞组成,这些细胞生活在二维网格上。这些细胞是以周期方式进化的。死亡细胞和活细胞的最初模式是第一代。第二代是从一些简单的规则同时应用于所有细胞。这些规则是: 细胞如果没有足够的陪伴就会死亡(邻接的细胞不足2个) 如果周围有4个或4个以上的细胞,细胞就会因人口过多而死亡。 如果(确切地)有3个细胞相邻,一个死细胞就会再生。

这是一个任务的一部分,但我不是在寻找一个汤匙喂养的解决方案。我们需要使用numpy和数组。

我的方法是生成一个具有随机1和0的初始提要的数组board,然后,在一个函数中,我创建另一个数组,它的一行和一列大于board,它将存储新值,然后反馈给它。我在元素ij上迭代(我知道在数组上迭代不是pythonic,所以我对建议和替代方案很开放),并对子数组nBlock[i-1:i+1,j-1:j+1]进行和(np.sum)。如果和大于4或小于4,则元素nBlock[np.array([i,j])]变为零(单元格死亡),否则为1(单元生命,或再生)。

问题是,这不管用。守则如下:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plot
import time as t
%matplotlib inline

def printBoard(board):
    im = plot.imshow(board, cmap='Greys', interpolation='none')
    plot.show()
    plot.close()

def initializeBoard():
    board = np.random.randint(2, size=(100, 100))
    return board

board = initializeBoard()
printBoard(board)

def checkAlive():
    if 1 not in board:
        print("All cells are dead! Life is over!")
        return 0
    else:
        return board

def calculateNeighbours(board):
    nBlock = np.zeros((102, 102))
    nBlock[1:101, 1:101] = board
    
    for i in range(1, 100):
        for j in range(1, 100):
            checksum = np.sum(nBlock[i-1:i+2, j-1:j+2])
            
            nBlock[:,0] = 0
            nBlock[0,:] = 0
            
            if checksum == 4:
                nBlock[np.array([i,j])] = 1
            elif checksum > 4 or checksum < 4:
                nBlock[np.array([i,j])] = 0
    
    return nBlock

def play(board):
    for i in range(1, 10):
        neighbours = calculateNeighbours(board)

        board = neighbours[1:101, 1:101]

        board = checkAlive()

        printBoard(board)

play(board)

数组board不会被修改。它返回相同的board

我注意到的另一件奇怪的事情是,如果删除for循环中的条件,数组就会被成功地修改。例如,

代码语言:javascript
复制
for i in range(0, 100):
    for j in range(0, 100):
        board[np.array([i,j])] = 1

给出一个矩阵,它将所有元素都更改为1。因此,关于if...else条件,它不允许我操作数组中的数据。

如有任何及所有的帮助,将不胜感激:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-08 19:28:04

误差

您的主要错误在checkAlive的接口逻辑中。该例程没有参数;当您找到一个活动单元时,您将返回共生play会立即分配给它的参数board

play中的play是一个局部变量:更改它不会改变您初始化的全局。相反,由于checkAlive没有局部变量,所以它返回的是程序中任何地方的全局变量board,它从未更改过。

溶液

由于checkAlive不改变董事会,所以不要返回。相反,返回一个简单的布尔值。如果需要的话,play可以检查并终止程序。

还:

你的细胞健康算法在几个方面是错误的。通过逻辑和修复。最值得注意的是,您使用一个值4来让一个单元格存活;这是非常不正确的。两个邻居使细胞处于当前状态;三个邻居使细胞存活;任何其他数目都会杀死它。

当前逻辑将单元格本身包含在计数中。这不能区分一个有3个朋友的活细胞和一个有4个朋友的死细胞。结果,你不正确地创建了一些细胞,并且你正在杀死活的细胞(与2个朋友一起活的细胞)。

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

https://stackoverflow.com/questions/40493867

复制
相关文章

相似问题

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