使用ProDy处理PDB衍生npz文件时,导入多numpy数组变量仅获取最后一个数组的问题及多变量存储需求
我明白你的问题啦——你在循环里生成了两个不同的xyzfile数组,但因为每次循环都覆盖了同一个变量,所以最后导入的时候只能拿到最后一个处理完的结果。下面给你几个解决办法,按需选择:
方法1:用列表存储所有生成的数组
这样可以把每个文件对应的数组都存起来,之后可以单独访问或者批量处理。修改你的循环代码:
import os import numpy as np os.chdir("pocket_files") files = os.listdir() # 初始化一个空列表来存所有数组 xyz_files_list = [] for i in files: var = np.load(i) coord = var['coordinates'].reshape(-1, 3) # 生成半径列 radii = np.expand_dims(np.repeat([1.5], len(coord)), axis=1) xyzfile = np.concatenate((coord, radii), axis=1) print(xyzfile.shape) # 把当前数组添加到列表里 xyz_files_list.append(xyzfile)
之后如果要在其他文件里使用,就导入这个列表:
from xyzrfile import xyz_files_list # 第一个文件的数组 print(xyz_files_list[0].shape) # 输出 (618, 4) # 第二个文件的数组 print(xyz_files_list[1].shape) # 输出 (1527, 4)
方法2:直接在循环里生成独立的输出文件(更推荐)
既然你最终要为每个数组生成独立文件,不如直接在处理的时候就保存,这样不用依赖变量存储,更直观也不容易出错:
import os import numpy as np os.chdir("pocket_files") files = os.listdir() for i in files: var = np.load(i) coord = var['coordinates'].reshape(-1, 3) radii = np.expand_dims(np.repeat([1.5], len(coord)), axis=1) xyzfile = np.concatenate((coord, radii), axis=1) # 生成对应的输出文件名,比如把原文件名的.npz改成_xyzr.npz output_filename = os.path.splitext(i)[0] + "_xyzr.npz" # 保存数组到文件 np.savez(output_filename, xyz_data=xyzfile) print(f"已保存文件:{output_filename},形状:{xyzfile.shape}")
这样处理完之后,你会在pocket_files目录下得到1b7fH.ag_xyzr.npz和1asyH.ag_xyzr.npz两个文件,之后需要使用的时候直接加载对应的文件即可:
# 加载第一个文件 data1 = np.load("pocket_files/1b7fH.ag_xyzr.npz") print(data1['xyz_data'].shape) # (618, 4) # 加载第二个文件 data2 = np.load("pocket_files/1asyH.ag_xyzr.npz") print(data2['xyz_data'].shape) # (1527, 4)
为什么原来的代码只拿到最后一个数组?
因为在循环中,每次执行xyzfile = np.concatenate(...)都会把同一个变量重新赋值,覆盖之前的内容。循环结束后,xyzfile自然只保留最后一次循环的结果,这是Python变量赋值的正常行为哦。
内容的提问来源于stack exchange,提问作者User240326
相关产品推荐
相关产品推荐

