Автор: Шабанов П.А.
E-mail: pa.shabanov@gmail.com
Blog: geofortran.blogspot.com
22:24 11.06.2015
Бывает, что коллеги просят дать им данные, с которыми ты работаешь. И, как это часто бывает в российской науке, они просят их в текстовом формате. Хотя ты работаешь, скажем, с netcdf. Но вот ещё незадача: формат нужен особый! Нужно, чтобы матрицы лежали блоками, а разделителями этих блоков должны быть даты (скажем, "год месяц день"), по которым можно установить временной срез блока. И так как ты - молодой и смелый, то кто, как не ты можешь решить эту задачу!
Если серьёзно, то бывает нужно записать данные из матрицы, но при этом "накидать шапку" в файл. Функция np.savetxt здесь, вроде, не особо помогает. Но есть трюк, который легко и непринуждённо справляется с поставленной задачей. Этот трюк - использование конструкции "with".
В python версии 2.5 и выше, файловый объект дополнен методами enter и exit. Первый метод просто возвращает файловый объект, а второй закрывает его.
f = open("x.txt", 'w')
print (f)
print (f.__enter__())
f.write('1')
print (f.__exit__(None, None, None))
f.write('2')
Приведённый выше код можно заменить на более элегантную конструкцию:
with open("x.txt") as f:
data = f.read()
print data
1
А теперь перейдём к матрицам и 3D массивам
import numpy as np
x = np.random.random((12, 10, 7))
ss = []
for i in xrange(12):
ss.append(' %d %d\n' % (2015, i+1))
print ss
with file('testfile.txt', 'w') as outfile:
for i, data_slice in enumerate(x):
outfile.write(ss[i])
np.savetxt(outfile, data_slice, fmt='%9.3f')
[' 2015 1\n', ' 2015 2\n', ' 2015 3\n', ' 2015 4\n', ' 2015 5\n', ' 2015 6\n', ' 2015 7\n', ' 2015 8\n', ' 2015 9\n', ' 2015 10\n', ' 2015 11\n', ' 2015 12\n']
Таким образом, первая ось (axis0=12) 3D массива x - это число блоков; вторая ось (axis1=10) - число строк в блоке; и третья ось (axis2=7) - число столбцов в блоке. Между блоками мы сформировали строки метаданных (год и месяц в нашем случае). Numpy функция savetxt позволяет задать формат представления данных. В результате у вас из случайной матрицы вышел текстовый файл с упаковкой "аля" фортран.