首页 > 解决方案 > Cython 中的布尔索引

问题描述

我是 Cython 的新手,并试图 Cythonize 我的一个功能:

PerHit %Time    Line
================================
            def lap(grid, ghosts_bool, D, dt):
88.3    14.9    grid_out = np.copy(grid)
72.3    12.2    grid_out *= -6
3.3     0.6     shore = grid[1:, :, :]
1.5     0.3     wave = grid[:-1, :, :]
69.6    11.8    shore[ghosts_bool[1:, :, :]] = wave[ghosts_bool[1:, :, :]]
94.8    16.0    grid_out[:-1, :, :] += grid[1:, :, :]
10.4    1.8     grid_out[-1, :, :] += grid[-1, :, :]
37.1    6.3     grid[ghosts_bool] = 0
2.3     0.4     shore = grid[:-1, :, :]
1.4     0.2     wave = grid[1:, :, :]
68.3    11.6    shore[ghosts_bool[:-1, :, :]] = wave[ghosts_bool[:-1, :, :]]
93.6    15.8    grid_out[1:, :, :] += grid[:-1, :, :]
10.5    1.8     grid_out[0, :, :] += grid[0, :, :]
36.6    6.2     grid[ghosts_bool] = 0

它已经以 Numpy 方式进行了优化,但仍然是我的程序中的一个瓶颈,因为随着&操作中True单元数量的增长变得非常繁重。ghosts_boolshorewaves

我已经了解了如何预定义类型、将 MemoryViews 发送到函数并在 Cython 中进行布尔索引,但遇到 Cython 并不完全支持就地操作。grid_out *= -6只需要一个省略号grid_out[...] *= -6,但这一个不起作用并引发错误:grid_out[1:, :, :] += grid[:-1, :, :]

我怎样才能最好地实施这个操作?还是循环是唯一的选择?

标签: pythonarraysoptimizationindexingcython

解决方案


推荐阅读