You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Wolfram编号的元胞自动机矢量化优化:无循环更新网格

无循环实现元胞自动机状态更新

完全可以通过Numpy的向量化操作避开循环,实现高效的网格更新,核心思路是将规则列表重塑为二维索引矩阵,再利用高级索引一次性生成新状态。

具体步骤:

  1. 规则列表重塑为二维矩阵
    把一维的Rule数组按照「状态数 × 邻居和种类数(9种,0-8)」的结构调整为二维数组。以你的CGOL示例为例,总状态数为2,按照规则切片逻辑(每个状态对应Rule中步长为total_states的切片)生成矩阵:

    import numpy as np
    total_states = 2
    Rule = [0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0]
    # 生成各状态对应的规则切片,组合成二维矩阵
    rule_matrix = np.array([Rule[s::total_states] for s in range(total_states)])
    

    此时rule_matrix[state][sum_nbr]可直接获取当前状态为state、邻居和为sum_nbr时的新状态。

  2. 向量化索引更新网格
    利用Numpy的高级索引特性,直接用当前网格world和邻居和数组nbrs作为二维矩阵的索引,一次性生成整个新网格:

    new_world = rule_matrix[world, nbrs]
    

    world和nbrs是同形状数组,Numpy会逐元素匹配(world[i,j], nbrs[i,j])进行索引,直接得到对应位置的新状态,全程无需循环。

原理说明

Numpy的高级索引支持用两个同形状数组分别指定二维数组的行、列索引,操作由底层优化实现,效率远高于Python原生循环,尤其适配大尺寸元胞网格的场景。

注意事项

  • 确保nbrs的取值始终在0-8之间,避免索引越界;
  • 确保world中的状态值在0到total_states-1范围内,否则会触发索引错误。

内容的提问来源于stack exchange,提问作者user18615293

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:10:38