我正在尝试将我在MATLAB中的项目翻译成Python + Numpy,因为MATLAB的内存不足。我的文件相当长,所以我试图制作一个显示相同错误的最小例子。
基本上我正在制作数据集的二维直方图,并希望在经过一些处理后保存它。问题是当我尝试保存直方图函数的输出时,numpy.save函数抛出“ValueError:设置带序列的数组元素”。当我看到Numpy的文档时,我找不到问题。
我的Python版本是2.6.6,Debian发行版上的Numpy版本1.4.1。
import numpy as np
import random
n_samples = 5
rows = 5
out_file = file('dens.bin','wb')
x_bins = np.arange(-2.005,2.005,0.01)
y_bins = np.arange(-0.5,n_samples+0.5)
listy = [random.gauss(0,1) for r in range(n_samples*rows)]
dens = np.histogram2d( listy, \
range(n_samples)*rows, \
[y_bins, x_bins])
print 'Write data'
np.savez(out_file, dens)
out_file.close()
完整输出:
$ python error.py
Write data
Traceback (most recent call last):
File "error.py", line 19, in <module>
np.savez(out_file, dens)
File "/usr/lib/pymodules/python2.6/numpy/lib/io.py", line 439, in savez
format.write_array(fid, np.asanyarray(val))
File "/usr/lib/pymodules/python2.6/numpy/core/numeric.py", line 312, in asanyarray
return array(a, dtype, copy=False, order=order, subok=True)
ValueError: setting an array element with a sequence.
答案 0 :(得分:0)
请注意,np.histogram2d
实际上返回三个数组的元组:(hist, x_bins, y_bins)
。如果你想保存所有这三个,你必须打开它们@Francesco说。
dens = np.histogram2d(listy,
range(n_samples)*rows,
[y_bins, x_bins])
np.savez('dens.bin', *dens)
或者,如果你只需要直方图本身,你可以保存它。
np.savez('dens.bin', dens[0])
如果您想跟踪哪些是哪个,请使用**kwds
代替*args
denskw = dict(zip(['hist','y_bins','x_bins'], dens))
np.savez('dens.bin', **denskw)
然后,您可以像
一样加载它dens = np.load('dens.bin')
hist = dens['hist']# etc