如何在循环中将2D与1D NumPy数组按要求保存为多文件?
如何根据NumPy数组生成多个对应温度的数据文件?
我有三个NumPy数组:
import numpy as np F = np.array([[-3764.9303402755891, -3764.9303494098212, -3764.9304257856452, -3764.9306329129422], [-3764.9338022566421, -3764.9338129752682, -3764.9338970928361, -3764.9341184863633]]) T = np.array([[ 10., 30.1, 50.2, 70.3], [ 10., 30.1, 50.2, 70.3]]) V = np.array([226.331804, 228.817957])
我需要生成4个指定格式的文件:
F_10.0K.dat: 226.331804 -3764.9303402755891 228.817957 -3764.9338022566421
F_30.1K.dat: 226.331804 -3764.9303494098212 228.817957 -3764.9338129752682
F_50.2K.dat: 226.331804 -3764.9304257856452 228.817957 -3764.9338970928361
F_70.3K.dat: 226.331804 -3764.9306329129422 228.817957 -3764.9341184863633
我之前尝试的代码只能输出所有列到一个文件,无法生成这4个单独的文件:
F_all_each_V_at_cte_T = [] for indx in range(0, cols): aux = F_all[:,indx] print ' F_all[:, indx] = ', F_all[:,indx] F_all_each_V_at_cte_T.append(aux) print 'F_all_each_V_at_cte_T = ', F_all_each_V_at_cte_T output_array = np.vstack((VOLUME_EACH, F_all_each_V_at_cte_T)).T np.savetxt('F_vs_V_10.0K.dat', output_array, header="Volume F at 10.0K", fmt="%0.13f")
请问该如何修改代码来实现需求?
解决方案
要搞定这个需求,关键是得逐个遍历每个温度对应的列,为每一列生成单独的文件。咱们可以按下面的步骤修改代码:
- 先提取唯一的温度值——因为T数组的两行数据是完全重复的,直接取第一行就够了
- 遍历每个温度对应的列索引,把V数组的两个值和F数组对应列的两个值组合成一行数据
- 为每个温度生成对应的文件名,然后把组合好的数据写入文件
修正后的完整代码如下:
import numpy as np # 定义输入数组 F = np.array([[-3764.9303402755891, -3764.9303494098212, -3764.9304257856452, -3764.9306329129422], [-3764.9338022566421, -3764.9338129752682, -3764.9338970928361, -3764.9341184863633]]) T = np.array([[ 10., 30.1, 50.2, 70.3], [ 10., 30.1, 50.2, 70.3]]) V = np.array([226.331804, 228.817957]) # 获取所有温度值(取第一行,因为两行完全重复) temperatures = T[0, :] # 遍历每个温度对应的列 for col_idx, temp in enumerate(temperatures): # 拼接成需要的一行数据:V[0], F[0, col_idx], V[1], F[1, col_idx] output_data = np.concatenate([[V[0]], [F[0, col_idx]], [V[1]], [F[1, col_idx]]]) # 生成符合要求的文件名 filename = f"F_{temp}K.dat" # 写入文件,确保格式和精度正确 np.savetxt(filename, output_data.reshape(1, -1), fmt="%0.13f", delimiter=" ")
代码细节说明:
- 温度提取:直接用
T[0, :]拿到所有温度值,避免处理重复数据的麻烦 - 循环遍历:
enumerate能同时拿到列的索引和对应的温度值,方便我们定位F数组里的对应列 - 数据拼接:用
np.concatenate把四个数值拼成一维数组,再用reshape(1, -1)转成二维行数组,这样np.savetxt会输出成一行 - 文件名格式化:f-string能轻松生成
F_10.0K.dat这种格式的文件名,完美匹配需求 - 输出格式:
fmt="%0.13f"保证数值的精度和示例一致,delimiter=" "指定用空格分隔数据
运行这段代码后,就能自动生成你需要的4个.dat文件,每个文件的内容完全符合预期。
内容的提问来源于stack exchange,提问作者DavidC.
相关产品推荐
相关产品推荐

