对于每个矩阵元素,我想添加其所有相邻单元格的值。
从我的初始数组开始
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()'
def count_living_neighbors(board):
count = np.zeros(board.shape, dtype=int)
#
# YOUR CODE HERE
#
for row in range(len(board)):
for column in range(len(board[row])):
total = 0
if (board[column - 1]).any() in board:
total += board[row][column-1]
if (board[column + 1]).any() in board:
total += board[row][column+1]
if (board[row - 1]).any() in board:
total += board[row-1][column]
if (board[row + 1]).any() in board:
total += board[row+1][column]
if (board[row + 1] and board[column - 1]).any() in board:
total += board[row+1][column-1]
if (board[row - 1] and board[column - 1]).any() in board:
total += board[row-1][column-1]
if (board[row + 1] and board[column + 1]).any() in board:
total += board[row+1][column+1]
if (board[row - 1] and board[column + 1]).any() in board:
total += board[row+1][column+1]
count[row][column] = total
return count
答案 0 :(得分:2)
您可以将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)
无论board
的形状如何,都是一样的。基本上,kernel
指的是邻居的位置(相对于中心的0)。
答案 1 :(得分:-1)
尝试scipy.signal.convolve2d
的内容convolve2d( yourMatrix, np.ones((3,3))
应该做的伎俩
答案 2 :(得分:-1)
关于你的代码:
你可能不太熟悉Python或numpy语法,所以我建议找一些教程来练习基础知识。
如果整个列中有任何单元格存在,则(board[column - 1]).any()
将为True,否则为False。之后,您正在测试是否包含True(如果列中的所有单元格都已死,则为False)包含在板内,该板始终为True。所以你的if
陈述没有多大意义。
为了测试neihgbourhood中的一个单元格是否存活,它看起来像以下任何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
据说计算在一个点附近存活的单元格数量你根本不应该打扰if
语句,只需添加所有周围值,一个死区值为0,一个活细胞价值1,所以只有活细胞才会出现在计数中。
进一步你的代码将非常慢,你永远不应该使用for
循环来迭代一个numpy数组,正确的做法是利用所谓的向量化操作,即一次应用于整个数组的操作,例如:board[:,1:]+board[:,:-1]
将为您提供一个数组,其中包含左侧单元格的总和+右侧的单元格,您可以计算该总和的每个单元格。 / p>