Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 矩阵康韦生命博弈中的邻域计数_Python_Numpy_Scipy - Fatal编程技术网

Python 矩阵康韦生命博弈中的邻域计数

Python 矩阵康韦生命博弈中的邻域计数,python,numpy,scipy,Python,Numpy,Scipy,对于每个矩阵元素,我想添加其所有相邻单元的值 从我的初始数组开始 board = np.array([[0, 1, 1], [0, 1, 0], [1, 0, 0]]) 我的结果应该是: ([2,2,2], [3,3,3], [1,2,1]) 我创建了一个函数,并使用蛮力方法来查找单元格周围是否存在单元格。如果是,则将这些值相加并返回总数。我不确定我的if语句是否正确。它说的是下面的错误 '具有多个元素的数组的真

对于每个矩阵元素,我想添加其所有相邻单元的值

从我的初始数组开始

board = np.array([[0, 1, 1],
                   [0, 1, 0],
                   [1, 0, 0]])
我的结果应该是:

([2,2,2],
 [3,3,3],
 [1,2,1])
我创建了一个函数,并使用蛮力方法来查找单元格周围是否存在单元格。如果是,则将这些值相加并返回总数。我不确定我的if语句是否正确。它说的是下面的错误

'具有多个元素的数组的真值不明确:请使用a.any()或a.all()


试试scipy.signal.convolve2d 类似于

convolve2d( yourMatrix, np.ones((3,3))

你可以使用
scipy.signal.convolve
mode='same'

from scipy import signal

kernel = np.ones((3, 3), dtype=np.int8)
kernel[1, 1] = 0
print(signal.convolve(board, kernel, mode='same'))
[[2 2 2]
 [3 3 3]
 [1 2 1]]
这里的
kernel
如下所示:

array([[1, 1, 1],
       [1, 0, 1],
       [1, 1, 1]], dtype=int8)
无论
板的形状如何,都将保持相同。基本上,
内核
指的是邻居的位置(相对于中心的0)。

关于您的代码: 您可能不太熟悉Python或numpy语法,因此我建议您找一些教程来练习基础知识。
(board[column-1])。如果整列中有任何单元格处于活动状态,则any()
为真,反之为假。在此之后,您将进行测试,以查看电路板中是否包含True(或False,如果列中的所有单元格都已死亡),该电路板将始终为True。所以你的
if
语句没有多大意义

要测试附近的一个细胞是否存活,它将类似于以下任何
if
语句:

if board[row-1][column - 1]  ==  1:
if board[row-1, column - 1]   ==  1: 
if board[row-1, column - 1] : #in Python 1 is True and 0 is False
也就是说,要计算一个点周围活细胞的数量,你不必费心于
如果
语句,只需加上周围的所有值,一个死细胞值为0,一个活细胞值为1,那么无论如何,只有活细胞才会出现在计数中。
更进一步说,您的代码将非常慢,您不应该使用
for
循环来迭代numpy数组,正确的方法是利用所谓的矢量化操作,即一次应用于整个数组的操作,例如:
板[:,1::+board[:,:-1]
将为您提供一个数组,该数组包含左侧单元格+右侧单元格中每个单元格的总和,您可以在其中计算该总和。

这听起来像是与内核的卷积。请查看scipy。您遇到的特定错误是因为您使用了错误的
。试试
&
。但我认为还有几个错误。
if board[row-1][column - 1]  ==  1:
if board[row-1, column - 1]   ==  1: 
if board[row-1, column - 1] : #in Python 1 is True and 0 is False