2013-05-16 2 views
0

Я пытаюсь перевести проект, который у меня есть в MATLAB, на Python + Numpy, потому что у MATLAB заканчивается нехватка памяти. Файл, который у меня есть, довольно длинный, поэтому я попытался сделать минимальный пример, который показывает ту же ошибку.ValueError при попытке сохранить ndarray (Numpy)

В основном я делаю 2d гистограмму набора данных и хочу сохранить его после некоторой обработки. Проблема в том, что функция numpy.save выдает «ValueError: установка элемента массива с последовательностью», когда я пытаюсь сохранить вывод функции гистограммы. Я не могу найти проблему, когда я смотрю на документы Numpy.

Моей версией Python является 2.6.6, Numpy версии 1.4.1 в дистрибутиве Debian.

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. 
+1

ваш код работает для меня на Ubuntu 12.04, python 2.7 и numpy 1.6.1 –

+0

Это странно. Я экспериментировал еще немного: использование библиотеки рассола действительно помогает сэкономить. –

+2

Справка 'savez' говорит 'np.savez (файл, * args, ** kwds)'. У меня такое ощущение, что ваша версия numpy не распаковывает списки. Можете ли вы попробовать с 'np.savez (out_file, * dens)'? –

ответ

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 
+0

Спасибо, кучка. Это делает трюк. –

Смежные вопросы