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

Python编写康威生命游戏触发only integer scalar arrays错误如何解决

错误原因
  • 第一个核心错误:你传给get_neighbours的row、col参数根本不是数组的下标索引,而是数组里的元素值
    看play_func里的循环逻辑:for row in two_dee_array拿到的row是二维数组里的整行元素,不是行号;内层for col in row拿到的col是单元格里的0/1值,不是列号。你把非整数索引的内容传给数组做切片,自然会触发类型错误。
  • 第二个潜在错误:get_neighbours里的遍历逻辑也有问题
    你写for i in sm_arr拿到的i是切片出来的小数组里的行元素,不是行下标,后续用sm_arr[i, j]访问也会报错。
  • 额外注意:数组[行切片, 列切片]是numpy数组的专属写法,如果你用的是Python原生的嵌套列表,这种带逗号的切片语法本身就不支持。
修正方案

步骤1:修改循环,遍历索引而非元素

把play_func的循环改为通过enumerate获取行列索引:

def play_func():
    # 遍历的时候同时拿索引和元素值
    for row_idx, row in enumerate(two_dee_array):
        for col_idx, col_val in enumerate(row):
            # 传索引给get_neighbours
            n_neighbours = get_neighbours(two_dee_array, row_idx, col_idx)
            print(n_neighbours)

步骤2:简化邻居计数逻辑

3x3切片的总和减去中心单元格本身的值,就是周围8个邻居的存活数,不需要自己写双层循环统计:

# 假设你用的是numpy数组,支持逗号切片
def get_neighbours(big_arr, row, col):
    # 切片拿到3x3邻域,生产环境可以加边界判断避免边缘单元格越界
    sm_arr = big_arr[(row - 1):(row + 2), (col - 1):(col + 2)]
    # 总和减去中心值就是邻居存活数
    return sm_arr.sum() - big_arr[row, col]

如果你用的是Python原生嵌套列表,需要调整写法适配原生语法:

def get_neighbours(big_arr, row, col):
    total = 0
    # 遍历周围8个方向+中心共9个位置
    for i in [-1, 0, 1]:
        for j in [-1, 0, 1]:
            # 跳过中心自己
            if i == 0 and j == 0:
                continue
            # 边界判断避免数组越界
            if 0 <= row + i < len(big_arr) and 0 <= col + j < len(big_arr[0]):
                total += big_arr[row + i][col + j]
    return total

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:18:03