将 numpy 数组的行写入文件内部而不是循环之后的最佳方法?

res*_*yte 5 python arrays numpy pickle writefile

我是这里的新手,总体来说是Python的新手,所以请原谅任何格式问题和其他问题。我是一名物理学家,我有一个参数模型,我想在其中迭代模型的一个或多个参数值(可能在 MCMC 设置中)。但为了简单起见,假设我只有一个具有N 个可能值的参数。在循环中,我计算模型和与其相关的几个标量指标。

我想将数据[参数值,metric1,metric2,...]逐行保存到文件中。我不在乎什么类型:.pickle、.npz、.txt、.csv 或其他任何类型都可以。

我不想计算完所有N个模型后保存数组。这里的问题是,有时参数值是如此非物理性,以至于我调用来计算模型的程序(这是一个经过多年开发的巨大复杂的东西,所以我没有触及它)使内核崩溃。如果我有N = 30000 个模型要做,而这种情况发生在29000处,我会非常不高兴并且浪费了很多时间。我可能还必须注意内存使用情况 - 我已经弄清楚如何使用文本文件执行我建议的操作,但它在大约2600行时崩溃,因为我认为它不喜欢打开那么长的文本文件。

所以,一些伪代码:

filename = 'outFile.extension'
dataArray = np.zeros([N,3])
idx = 0
for p in Parameter1:
    modelOutputVector = calculateModel(p)
    metric1, metric2 = getMetrics(modelOutputVector)
    dataArray[idx,0] = p
    dataArray[idx,1] = metric1
    dataArray[idx,2] = metric2
    ### Line that saves data here
    idx+=1
Run Code Online (Sandbox Code Playgroud)

我偏爱 npz 或 pickle 格式,但不知道如何用这两种格式来做到这一点。如果有更好的格式或更好的解决方案,我很感激任何建议。

编辑:我试图在循环内创建一个文本文件是这样的:

fileObject = open(filename, 'ab')
np.savetxt(fileObject, rowOfData, delimiter = ',', newline = ' ')
fileObject.write('\n')
fileObject.close()
Run Code Online (Sandbox Code Playgroud)

第一次它在 2600 处崩溃或者其他什么我认为这只是巧合,但每次我尝试这个,它就在那里停止。我可以破解它并制作一批全部 2600 行的文件,但必须有更好的解决方案。

Ree*_*ner 0

由于对错误的了解如此有限,很难说,但如果您认为这是文件写入错误,也许您可​​以尝试以下操作:

with open(filename, 'ab') as fileObject:
    # code that computes numpy array
    np.savetxt(fileObject, rowOfData, delimiter = ',', newline = ' ')
    fileObject.write('\n')
# no need to .close() because the "with open()" will handle it
Run Code Online (Sandbox Code Playgroud)

然而

  • 我没用过np.savetxt()
  • 我不是您项目的专家
  • 我什至不知道这是否真的是文件写入错误

我只是更喜欢这种with open()技术,因为这就是我读过的所有介绍性 Python 书籍如何构建文件读取/写入过程的方式,所以我认为其中有智慧。您还可以考虑像 fabianegli 评论的那样保存到单独的文件(这就是我的工作所做的)。