我的代码生成一个二维数组,我想将其保存到一个文件中。这可以使用numpy.savetxt轻松完成,如示例代码所示。但我希望做些不同的事情。在下面的代码中,我为5个步行者生成随机游走。对于每次步行,我生成助行器的位置一段时间并将位置存储在列表中。每次完成步行后,我将包含walker位置的整个列表添加为已存在的数组S_data的新行。在下一步(或迭代)结束时,我添加下一个步行者的位置列表,依此类推。因此,在每个步行者的迭代结束时,新的行被添加到S_data。在所有遍历结束时,此S_data最终使用numpy.savetxt保存到外部文件。
import numpy as np
no_of_walkers = 5
t_max = 10
S_data=np.zeros(t_max)
for R in range(no_of_walkers):
position = []
x = 0.0
for t in range(t_max):
x = x + np.random.randint(-1, 2)
position.append(x)
S_data = np.vstack([S_data, position])
S_data = np.delete(S_data, obj=0, axis=0)
np.savetxt('data_file.txt', S_data)
我希望做的是,在每次漫步结束时,我不想将位置列表添加到S_data,而是将其写入外部文件。再次在下一次迭代结束时,我将把下一个walker的位置列表添加为外部文件的新行,依此类推。我想这样做是因为,我将不得不为大量步行者运行此代码,并且还需要更长时间,因此我的代码将占用大量RAM,我想避免使用。是否有一种pythonic方法可以在每次迭代结束时将列表导出到同一个外部文件,而不会覆盖以前的数据?
答案 0 :(得分:1)
如果我理解正确,似乎你试图在每次迭代后附加到一个文件(如果你的数据文件已经存在),如果是这样的话,请使用:
f = open("data_file.txt", "a+")
"a+"
表示您希望随后调用write
。文档here。如果您正在进行一系列迭代,请确保在任何循环之外打开文件。
当然你也可以在每次迭代后循环编写新行的每个元素,然后用这样的东西写一个换行符:
#open file
for item in newRow:
#Your formatting will determine the specifics of this write
f.write(item)
f.write("\n")
这样的事情就像我认为的那样:
# Use with for file safety
with open('output.txt', 'w') as f:
for R in range(no_of_walkers):
x = 0.0
for t in range(t_max):
x = x + np.random.randint(-1, 2)
f.write(str(x) + ' ')
f.write('\n')
output.txt的
1.0 1.0 1.0 1.0 1.0 0.0 0.0 -1.0 -2.0 -2.0
0.0 1.0 0.0 0.0 -1.0 0.0 1.0 0.0 1.0 1.0
-1.0 -1.0 -1.0 -2.0 -1.0 -1.0 -2.0 -1.0 -2.0 -3.0
-1.0 -1.0 0.0 1.0 0.0 1.0 2.0 1.0 2.0 1.0
1.0 0.0 -1.0 -2.0 -1.0 -1.0 0.0 1.0 1.0 0.0
至于效率,我很确定你最初尝试写的方式更好。请参阅此post。