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
相关产品推荐
相关产品推荐

