我见过这个post,想要做类似的事情,但不完全一样。
我正在实施一些生命游戏游戏并使用numpy arrays
来表示游戏的状态。所以我需要检查一下单元有多少活着的邻居。我已经获得了一个函数来获取邻居的窗口,给出了我想要的窗口大小的坐标和行数以及列数。
所以我的窗户通常会像这样大小为3x3:
T = True
F = False
[[T,T,T],
[F,T,T],
[F,F,F]] # some random truth values
在此表示中True
代表一个活着的细胞。
现在我编写了一些迭代遍历状态的所有单元格的代码,使用double for循环计算True值等,但我认为可能有更好的numpy解决方案。
我在天真的方法中做了什么:
np.sum
)并将其添加到活动邻居计数(如果单元格本身处于活动状态,则为-1,这样我只计算邻居而不计算单元本身)< / LI>
True
值。 (我将从一个数组开始,我使用np.full((height, width), False, dtype=bool)
)基本上:
if cell meets criteria:
write True at the cell's position in a new array
但是满足条件取决于多行,因为状态的numpy数组是一个2D数组。这就是为什么我认为链接的帖子很接近但不完全是我需要的。
如何以高效的numpy-y方式做到这一点,避免不必要的循环?
澄清
我正在寻找使用numpy和scipy在python中实现它的最佳方法,它的目的是提高可读性并具有良好的性能。
答案 0 :(得分:2)
也许我不明白你想做的一切,但是什么阻止你只使用numpy.sum
功能呢?
示例 - 让状态为:
import numpy as np
state = np.random.randint(1, 10, (9,9))
这里我使用{0,1}作为状态的值,其中1表示&#34; alive&#34;。 然后你可以在被调查的细胞周围切片,例如[2,3]
s = state[1:3,2:5]
if s[1,1]:
val = -1
else
val = 0
val += s.sum()
如果你把它放在for循环中并注意边框情况,夹紧或包装,它应该按照你描述的那样做。
如果您正在寻找一个简短的优雅实现,可以非常efficiently with Python and Numpy完成。