如何保存这个numpy数组?

rbl8hiat  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个numpy数组,我试图用python3保存,但是每次我尝试使用它时numpy.save()都会崩溃。我需要做什么来保存这个数组?
我试了这个代码:

saveFilePath = Path(fc.selected,saveFolder,saveFileName+'.npy')
saveFile = open(saveFilePath,'w') 
# THIS IS THE ERROR; it should be 'wb', not 'w'; see answer by hpaulj
np.save(saveFile,vz[key1][key2][key3])

字符串
其中saveFilePath和saveFile如下:saveFile & saveFilePath在重要的情况下,文件saveFile确实存在并且确实被创建,它应该在那里,并且它有0个字节(我期望失败的保存命令)。
出现以下错误:screencap of error Traceback
老实说,这没有意义,因为在前面的代码中,我使用相同的方法来保存不同的numpy数组。
我试过json.dump()pickle.dump(),并得到错误,我宁愿不使用它们,因为其他问题带来的。
数组看起来像这样:


的数据
这应该是一个非常简单的保存,怎么回事?

eh57zj3b

eh57zj3b1#

受我发现的旧帖子的启发,我尝试在“w”模式下打开文件,并得到了您的错误:

In [521]: f=open('foobar.npy','w')

In [522]: np.save(f, np.arange(10))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[522], line 1
----> 1 np.save(f, np.arange(10))

File <__array_function__ internals>:200, in save(*args, **kwargs)

File ~\miniconda3\lib\site-packages\numpy\lib\npyio.py:522, in save(file, arr, allow_pickle, fix_imports)
    520 with file_ctx as fid:
    521     arr = np.asanyarray(arr)
--> 522     format.write_array(fid, arr, allow_pickle=allow_pickle,
    523                        pickle_kwargs=dict(fix_imports=fix_imports))

File ~\miniconda3\lib\site-packages\numpy\lib\format.py:695, in write_array(fp, array, version, allow_pickle, pickle_kwargs)
    659 """
    660 Write an array to an NPY file, including a header.
    661 
   (...)
    692 
    693 """
    694 _check_version(version)
--> 695 _write_array_header(fp, header_data_from_array_1_0(array), version)
    697 if array.itemsize == 0:
    698     buffersize = 0

File ~\miniconda3\lib\site-packages\numpy\lib\format.py:453, in _write_array_header(fp, d, version)
    451 else:
    452     header = _wrap_header(header, version)
--> 453 fp.write(header)

TypeError: write() argument must be str, not bytes

字符串
正确的保存和加载

In [528]: with open('foobar.npy','wb') as f:
     ...:     np.save(f,np.arange(10))
     ...:     

In [529]: np.load('foobar.npy')
Out[529]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])


你忽略了显示完整的错误消息,也没有告诉我们任何关于你试图使用的文件对象的信息。出于某种原因,你得出的结论是,问题出在你试图保存的数组上,而不是你试图保存它的文件上。
为什么
这个错误有点模糊,因为开发人员没有预料到用户会犯这个错误。当文件用“w”打开时,它的所有写入都应该是str,而不是byte(string)。但是保存代码将头格式化为字节串。所以write引发了这个错误。
通常np.save会获取一个文件名,然后执行自己的open。保存到一个已经打开的文件是允许的,但是它不会偏执到去验证打开的文件是否有正确的模式。

相关问题