构建 numpy 数组列表

building lists of numpy arrays

我有以下一段代码,它根据从文件中读取的数据构建二维 numpy 数组列表。

rawLambda = np.loadtxt("LambdaM.dat")
rawchi0 = np.loadtxt("chi0M.dat")

npts = len(rawLambda[:,0])//10000

LambdaList = []
chi0List = []
Lambdatmp = np.zeros((100,100),dtype=complex)
chi0tmp = np.zeros((100,100),dtype=complex)
for i in range(npts):
 for l in range(10000):
  ii = i*10000+l
  l1 = int(rawLambda[ii,3]-1)
  l2 = int(rawLambda[ii,4]-1)
  Lambdatmp[l1,l2] = rawLambda[ii,5] + 1.j*rawLambda[ii,6]
  l1 = int(rawchi0[ii,3]-1)
  l2 = int(rawchi0[ii,4]-1)
  chi0tmp[l1,l2] = rawchi0[ii,5] + 1.j*rawchi0[ii,6]
  
 LambdaList.append(Lambdatmp)
 chi0List.append(chi0tmp)

如果我尝试从 chi0List 中检索单个数组,例如,

for i in range(npts):
 tst = np.sum(chi0List[i])
 print(i,tst)

结果表明列表中的所有数组都与最后添加的数组相同。有人可以告诉我我在这里做错了什么吗?!谢谢!

当使用 numpy 或列表时,您应该知道您正在复制什么。您附加到列表的数组只是数组的浅表副本。它们都指向同一个数组。在追加时,您应该创建一个副本,以免将指针追加到同一个列表,如

LambdaList.append(Lambdatmp.copy())
chi0List.append(chi0tmp.copy())

这是因为您没有创建新列表

chi0tmp = np.zeros((100,100),dtype=complex)

这会在内存中提供一个您可以就地更改的数组。追加只会在您的列表中删除该数组的视图,该视图随每个循环而更改。要解决此问题,请在外部 for 循环

中创建临时数组