构建 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 循环
中创建临时数组
我有以下一段代码,它根据从文件中读取的数据构建二维 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 循环
中创建临时数组