2015-11-13 4 views
3

Мне нужно запустить большое количество вычислений, и мне приходится каждый раз сохранять текст в 2D-файле, поэтому я хотел бы сохранить результаты в режиме реального времени в виде 3D-текстового файла с каждым фрагментом, соответствующим одному результату вычисления ,Как сохранить 3D-массив Python/NumPy в виде текстового файла?

Первый расчет в порядке, но когда я делаю второй расчет, во время шага «np.loadtxt» размеры массива становятся 2D ... Поэтому я не могу достичь своей цели ... и я могу " т сделать Reshape, когда я начинаю размеры (..., ..., 1)

#MY FIRST RESULTS 
test1 = open("C:/test.txt", "r") 
test_r = np.genfromtxt(test, skip_header=1) 
test_r = np.expand_dims(test_r, axis=2) #I create a new axis to save in 3D 
test1.close() 

#I test if the "Store" file to keep all my results is created. 
try: 
    Store= np.loadtxt('C:/Store.txt') 
except: 
    test=1 

#If "Store" is not created, I do it or I concatenate in my file. 
if test ==1: 
    Store= test_r 
    np.savetxt('C:/Store.txt', Store) 
    test=2 
else: 
    Store = np.concatenate((Store,test_r), axis=2) 
    np.savetxt('C:/Store.txt', Store) 


#MY SECOND RESULTS 
test2 = open("C:/test.txt", "r") 
test_r = np.genfromtxt(test, skip_header=1) 
test_r = np.expand_dims(test_r, axis=2) 
test2.close() 

#I launch the procedure again to "save" the results BUT DURING THE LOADTXT STEP THE ARRAY DIMENSIONS CHANGE TO BECOME A 2D ARRAY... 
try: 
    Store= np.loadtxt('C:/Store.txt') 
except: 
    test=1 


if test ==1: 
    Store= test_r 
    np.savetxt('C:/Store.txt', Store) 
    test=2 
else: 
    Store = np.concatenate((Store,test_r), axis=2) 
    np.savetxt('C:/Store.txt', Store) 
+3

Может быть, вы могли бы быть заинтересованы, а с помощью модуля Рассол, который с легкостью можете сохранить/загрузить любой объект Python? –

+0

Я не знаю, я проверю это;) спасибо, у вас есть пример? я ищу это – user3601754

+1

В зависимости от вашего варианта использования вы можете уйти с чем-то похожим на то, что я делал недавно на работе. Возьмите свой массив numpy, конвертируйте в обычный список python и добавьте его в файл JSON. JSON очень портативен, и вы можете читать свои массивы оттуда. Как сказал Барухель, существуют способы хранения ваших данных numpy в двоичной форме (например, рассол). У Numpy есть встроенные функции для этого (первые два модуля поверх списка http://docs.scipy.org/doc/numpy-1.10.0/reference/routines.io.html) –

ответ

3

Вот пример cPickle:

import cPickle 

# write to cPickle 
cPickle.dump(thing_to_save, open("filename.pkl", "wb")) 

# read from cPickle 
thing_to_save = cPickle.load(open("filename.pkl", "rb")) 

"wb" и "rb" параметры функции open() являются важный. CPickle записывает объекты в двоичном формате, поэтому использование только "w" и "r" не будет работать.

+0

Спасибо, что это работает;) – user3601754

3

Если файл сохранения должен быть текстовым текстом 'csv', вы можете использовать несколько savetxt и loadtxt. Ключ известен тем, что оба из них могут принять открытый файл в качестве входных данных.

Дать пример:

In [31]: A=np.arange(3*2*4).reshape(3,2,4)  
In [32]: A # normal display as 3 blocks of 2d array 
Out[32]: 
array([[[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7]], 

     [[ 8, 9, 10, 11], 
     [12, 13, 14, 15]], 

     [[16, 17, 18, 19], 
     [20, 21, 22, 23]]]) 

In [36]: for a in A:print a, '\n' # or iterate on the 1st dimension 
[[0 1 2 3] 
[4 5 6 7]] 

[[ 8 9 10 11] 
[12 13 14 15]] 

[[16 17 18 19] 
[20 21 22 23]] 

После этого примера я могу итерацию по файлу, используя savetxt для каждой подрешетки:

In [37]: with open('3dcsv.txt','wb') as f: 
    for a in A: 
     np.savetxt(f, a, fmt='%10d') 
     f.write('\n') 
    ....:   

Confirm файл записи с системой cat (через IPython) :

In [38]: cat 3dcsv.txt 
     0   1   2   3 
     4   5   6   7 

     8   9   10   11 
     12   13   14   15 

     16   17   18   19 
     20   21   22   23 

Для простого чтения, loadtxt, по-видимому, игнорирует пустые строки, возвращая массив размером 6 x 4. Поэтому я знаю, что это должно быть (2,3,4) Я могу легко изменить результат.

In [39]: np.loadtxt('3dcsv.txt') 
Out[39]: 
array([[ 0., 1., 2., 3.], 
     [ 4., 5., 6., 7.], 
     [ 8., 9., 10., 11.], 
     [ 12., 13., 14., 15.], 
     [ 16., 17., 18., 19.], 
     [ 20., 21., 22., 23.]]) 

После небольшой отладки у меня есть этот многократный loadtxt для работы. loadtxtgenfromtxt) работает со списком строк.

In [53]: A1=[]  # list to collect blocks 

In [54]: with open('3dcsv.txt') as f: 
    lines = []  # list to collect lines 
    while 1: 
     aline = f.readline() 
     if aline.strip(): 
      lines.append(aline)  # nonempty line 
     else:    # empty line 
      if len(lines)==0: break 
      A1.append(np.loadtxt(lines, dtype=int)) 
      lines = [] 
    ....:    

In [55]: A1 = np.array(A1) 

In [56]: A1 
Out[56]: 
array([[[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7]], 

     [[ 8, 9, 10, 11], 
     [12, 13, 14, 15]], 

     [[16, 17, 18, 19], 
     [20, 21, 22, 23]]]) 

Это не может быть наиболее надежное спаривание сохранения/загрузки, но оно дает основу для построения чего-то лучшего.

Но если он не должен быть текст, то pickle прекрасно, как родной NumPy «сохранения/загрузки»

In [57]: np.save('3dsave.npy',A) 

In [58]: np.load('3dsave.npy') 
Out[58]: 
array([[[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7]], 

     [[ 8, 9, 10, 11], 
     [12, 13, 14, 15]], 

     [[16, 17, 18, 19], 
     [20, 21, 22, 23]]]) 
Смежные вопросы