Python新手遇IndexError:数组意外变为标量的问题排查
解决你的IndexError问题:参数传递错误+拼写错误
首先给你吃个定心丸:你的randomarray函数完全没问题!np.where(array1 <= 0.5, 1,-1)不会把数组变成标量——你打印得到的-4是后面代码逻辑错误导致的,不是这个函数的锅。
让我们一步步拆解问题:
核心错误点
你遇到的IndexError: invalid index to scalar variable来自两处低级错误:
- 函数名拼写错误:把
closepoints写成了closepoint - flip函数参数传递完全错误:
- flip函数定义是
def flip(array1, N, x ,y),需要传入整个数组、N、坐标x,y - 但你调用时写的是
flip(lat[i,j], array1, i, j),这里第一个参数传的是lat[i,j](单个标量值),第二个参数传的是closepoints返回的标量和,完全不符合函数的参数要求!
- flip函数定义是
另外你还有一处小错误:lat[i,j] *= -lat[i,j]应该改成lat[i,j] *= -1(不然会变成原数的平方,也就是1,达不到翻转1/-1的效果)
修正后的完整代码
import numpy as np def randomarray(N): array1 = np.random.rand(N,N) array1 = np.where(array1 <= 0.5, 1,-1) return array1 def closepoints(array1, N, x, y): return array1[(x - 1) % N, y] + array1[(x + 1) % N, y] + \ array1[x, (y - 1) % N] + array1[x, (y + 1) % N] def flip(array1, N, x ,y): # 这里sum是多余的!closepoints已经返回的是四个点的和,不需要sum return 2 * array1[x, y] * closepoints(array1, N, x, y) sweeps_no = 50 N = 5 # 补充定义N,你之前的代码漏了这一步 lat = randomarray(N) energies = 0 # 初始化能量累计变量 energycount = [] for k in range(sweeps_no): i = np.random.randint(N) j = np.random.randint(N) # 1. 修正函数名拼写错误 close_sum = closepoints(lat, N, i, j) # 2. 修正flip的参数传递:传入整个数组lat,N,坐标i,j energy = flip(lat, N, i, j) print(energy) if energy <= 0: # 修正翻转逻辑:*=-1才是真正翻转1/-1 lat[i,j] *= -1 energies += energy energycount.append(energies)
额外说明
- 你之前的
flip函数里写了sum(closepoints(...)),但closepoints已经返回的是四个点的数值和,不需要再用sum,这也是一处冗余错误 - 代码里需要提前定义
N、初始化energies和energycount,不然会报未定义的错误
内容的提问来源于stack exchange,提问作者Chris Lee
相关产品推荐
相关产品推荐

