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
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