python - 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_bool
shore
waves
我已经了解了如何预定义类型、将 MemoryViews 发送到函数并在 Cython 中进行布尔索引,但遇到 Cython 并不完全支持就地操作。grid_out *= -6
只需要一个省略号grid_out[...] *= -6
,但这一个不起作用并引发错误:grid_out[1:, :, :] += grid[:-1, :, :]
。
我怎样才能最好地实施这个操作?还是循环是唯一的选择?
解决方案
推荐阅读
- c# - 如何在文本文件中按项目和总数量进行分组
- java - 大型项目中的套接字和打印机可能存在内存泄漏
- javascript - Jqgrid 排序和“无记录消息”不起作用
- ios - 使用Objective-C时的基本输入输出是什么
- android - 无法在 onCreateView 中使用查询中的对象
- symfony - 如何在 Symfony 中定义默认/其他路由?
- python - Python:在一个语句中打印列表中的所有项目
- ios - 如何在连接多个网站的应用程序中集成 iOS 12 Autofill(以浏览器为例)?
- typescript - 为什么不使用联合两侧的密钥导致 TS 抱怨?
- google-apps-script - Google 表格中的 Google 表单下拉列表