numpy 中是否有可用函数迭代 ndarray 并使用自定义函数修改每个元素?

Is there any available function in numpy that iterate a ndarray and modify each element with a custom function?

def evolve(self):
    newgrid =signal.convolve2d(self.grid, self.neighborhood, 'same')
    dimentionX = self.grid.shape[0]
    dimentionY = self.grid.shape[1]
    for i in range(0, dimentionX):
        for j in range(0, dimentionY):
            if newgrid[i,j] < 2:
                self.grid[i,j] = self.deadValue
            elif newgrid[i,j] == 3:
                self.grid[i,j] = self.aliveValue
            elif newgrid[i,j] > 3:
                self.grid[i,j] = self.deadValue
    return self.grid

我正在做这样的事情。这个函数经常被调用。当网格不大时(例如 64x64),这很好。但是,当网格超过一千个时,模拟运行很慢。

有人告诉我,适当使用 numpy 应该会快得多。有人告诉我 numpy 提供了这样一个功能,它与我写的功能相同,但速度更快。

经过对文档的一些研究,我只发现了这个:

但是这个只支持boolean return类型,并且只支持对每个元素进行简单的回调,而我需要对每个元素进行复杂的操作(多行,涉及'if')

请注意,我不讨论您的方法。我严格回答你的问题。


求助于 boolean indexing 怎么样?如下

# [...]
self.grid[(newgrid < 2) | (newgrid > 3)]  = self.deadValue
self.grid[newgrid == 3] = self.aliveValue
# [...]

?

函数为np.where

def evolve(self):
    newgrid = signal.convolve2d(self.grid, self.neighborhood, 'same')
    self.grid = np.where(newgrid == 3, self.aliveValue, self.deadvalue)
    return self.grid