"OSError:无法以二进制模式将对象数组写入文件"

Wil*_*nao 3 numpy scipy python-3.5

它必定是那些日子之一.我一直能够使用函数tofile来保存数据.但由于某种原因,今天它没有工作:)

import numpy as np

blah.....

print(type(blist))
npdata = np.array(blist)
print(type(npdata))
npdata.tofile('myfile.dat')
Run Code Online (Sandbox Code Playgroud)

获取以下结果:

Traceback (most recent call last):
File "C:/context.py", line 67, in <module>
npdata.tofile('myfile.dat')
OSError: cannot write object arrays to a file in binary mode
<class 'list'>
<class 'numpy.ndarray'>
Run Code Online (Sandbox Code Playgroud)

所以它说我以二进制模式打开文件.但据我所知,我不是以二进制模式打开它.

编辑(问题解决后):当我发布这个问题时,我假设blist是一个整数列表.相反,它是一个整数列表的列表.问题是,当我创建它时,我得到的是一个dtype = object而不是我期待的dtype = int32.

士气:确保正确使用np.append/np.extend并始终明确设置dtype.

hpa*_*ulj 5

根据tofile文档,如果sep是默认值,它将以二进制模式写入数组.

In [714]: x
Out[714]: array([[1, 2, 3], [1, 2]], dtype=object)

In [715]: x.tofile('test')
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-715-0ff8f3c688ad> in <module>()
----> 1 x.tofile('test')

OSError: cannot write object arrays to a file in binary mode
Run Code Online (Sandbox Code Playgroud)

它以二进制模式打开文件,但后来发现该数组是一个对象数组,它无法以这种方式编写.默认二进制模式用于快速将数字写入文件,而不是常规对象.

指定a sep,使其以文本模式写入,在本例中有效:

In [716]: x.tofile('test',sep=',')

In [717]: cat test
[1, 2, 3],[1, 2]
Run Code Online (Sandbox Code Playgroud)

我有另一个包含生成器的对象数组(来自另一个问题).

In [719]: g.tofile('test',sep=',')

In [720]: cat test
<generator object <genexpr> at 0xb266632c>
Run Code Online (Sandbox Code Playgroud)

因此在text模式下,tofilestr(x)数组的表示写入文件.

np.save更善于处理对象数组.它用于pickle编码无法写为常规数组的对象. np.load可以重新加载这样的文件.