繁体   English   中英

将函数应用于2D numpy数组元素

[英]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解决方案。

我在天真的方法中会做些什么:

  1. 遍历状态的所有单元(不仅是窗口)(我想制定一些代码,如果一个单元满足一个标准或另一个条件(存活并存活或死亡或存活),则要执行该代码)
  2. 获取窗口(包装或不包装)(我已经拥有的功能)
  3. 检查当前单元是否还活着(可以在状态的numpy数组中进行查找)
  4. 如果它还活着,则以一个活着的邻居计数为-1开始,否则以0开始
  5. 计算窗口的所有True值( np.sum )并将其添加到活动的邻居计数(如果单元格本身处于活动状态,则为-1,因此我仅计算邻居而不是单元格本身)
  6. 根据活动邻居的计数是否在一定范围内(可配置),以另一(新)状态的数组True值写入。 (我将从使用以下数组创建的数组开始: np.full((height, width), False, dtype=bool)
  7. 继续使用该新数组,将旧数组保留在列表中以用于历史记录或日志记录

基本上:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM