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

时间:2016-04-19 01:33:01

标签: python numpy

我见过这个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解决方案。

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

  1. 遍历状态的所有单元格(不仅仅是窗口)(我想制定一些代码,以便在单元符合标准或其他条件时执行(生存并存活或死亡并活跃起来))
  2. 获取窗口(包装或不包装)(我已经拥有的功能)
  3. 检查当前单元格是否处于活动状态(可以在状态的numpy数组中进行查找)
  4. 如果它是活着的,则以-1的活动邻居计数开始,否则以0
  5. 开始
  6. 计算窗口的所有真值(np.sum)并将其添加到活动邻居计数(如果单元格本身处于活动状态,则为-1,这样我只计算邻居而不计算单元本身)< / LI>
  7. 取决于活动邻居的计数是否在某个范围内(可配置),写入另一个(新)状态的数组True值。 (我将从一个数组开始,我使用np.full((height, width), False, dtype=bool)
  8. 创建
  9. 继续使用新数组,将旧数组保留在历史记录或日志记录列表中
  10. 基本上:

    if cell meets criteria:
        write True at the cell's position in a new array
    

    但是满足条件取决于多行,因为状态的numpy数组是一个2D数组。这就是为什么我认为链接的帖子很接近但不完全是我需要的。

    如何以高效的numpy-y方式做到这一点,避免不必要的循环?

    澄清

    我正在寻找使用numpy和scipy在python中实现它的最佳方法,它的目的是提高可读性并具有良好的性能。

1 个答案:

答案 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完成。