[英]Apply function to 2D numpy array elements
我看过这篇文章 ,想做类似但不完全相同的事情。
我正在实现一个小型的生活游戏,并使用numpy arrays
表示游戏的状态 。 因此,我需要检查一个单元中有多少个活着的邻居 。 我已经有了一个获取邻居窗口的功能,该窗口根据我想要的窗口大小给出坐标,行数和列数。
所以通常我的窗户是3x3大小,如下所示:
T = True
F = False
[[T,T,T],
[F,T,T],
[F,F,F]] # some random truth values
在此表示中, True
代表一个活着的细胞。 现在,我编写了一些代码来遍历状态的所有单元,计算True值,等等,使用double for循环,但是我认为可能有更好的numpy解决方案。
我在天真的方法中会做些什么:
np.sum
)并将其添加到活动的邻居计数(如果单元格本身处于活动状态,则为-1,因此我仅计算邻居而不是单元格本身) 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中实现此目标的最佳方法,该方法旨在具有很好的可读性和良好的性能。
也许我不理解您要尝试做的所有事情,但是是什么阻止了您仅使用numpy.sum
函数?
示例-假设状态为:
import numpy as np
state = np.random.randint(1, 10, (9,9))
在这里,我将{0,1}用作状态值,其中1表示“有效”。 然后,您可以在要研究的细胞周围切片,例如[2,3]
s = state[1:3,2:5]
if s[1,1]:
val = -1
else
val = 0
val += s.sum()
如果将其放入for循环中,并注意边框情况,适当地夹紧或包裹,它应该按照您的描述进行操作。
如果您正在寻找一个简短的优雅实现,那么可以使用Python和Numpy非常有效地完成它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.