You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 09:53:09