Если вы хотите записать его на диск, чтобы его можно было легко прочитать как массив numpy, посмотрите numpy.save
. Травление тоже подойдет, но для больших массивов оно менее эффективно (а у вас это не так, так что и то, и другое подойдет).
Если вы хотите, чтобы он был удобочитаемым человеком, изучите numpy.savetxt
.
Изменить: Итак, похоже, не так savetxt
уж и хорош вариант для массивов с> 2 измерениями ... Но просто чтобы подвести все к полному выводу:
Я только что понял, что numpy.savetxt
задыхается от ndarrays с более чем двумя измерениями ... Вероятно, это сделано намеренно, так как нет встроенного способа указать дополнительные измерения в текстовом файле.
Например, это (2D-массив) отлично работает
import numpy as np
x = np.arange(20).reshape((4,5))
np.savetxt('test.txt', x)
Хотя то же самое не получится (с довольно неинформативной ошибкой :) TypeError: float argument required, not numpy.ndarray
для 3D-массива:
import numpy as np
x = np.arange(200).reshape((4,5,10))
np.savetxt('test.txt', x)
Одно из решений - просто разбить трехмерный (или более крупный) массив на двухмерные срезы. Например
x = np.arange(200).reshape((4,5,10))
with file('test.txt', 'w') as outfile:
for slice_2d in x:
np.savetxt(outfile, slice_2d)
Однако наша цель - сделать его понятным для человека и при этом легко прочитать его numpy.loadtxt
. Поэтому мы можем быть более подробными и различать фрагменты, используя закомментированные строки. По умолчанию numpy.loadtxt
игнорируются любые строки, начинающиеся с #
(или любого символа, указанного в comments
kwarg). (Это выглядит более подробным, чем есть на самом деле ...)
import numpy as np
# Generate some test data
data = np.arange(200).reshape((4,5,10))
# Write the array to disk
with open('test.txt', 'w') as outfile:
# I'm writing a header here just for the sake of readability
# Any line starting with "#" will be ignored by numpy.loadtxt
outfile.write('# Array shape: {0}\n'.format(data.shape))
# Iterating through a ndimensional array produces slices along
# the last axis. This is equivalent to data[i,:,:] in this case
for data_slice in data:
# The formatting string indicates that I'm writing out
# the values in left-justified columns 7 characters in width
# with 2 decimal places.
np.savetxt(outfile, data_slice, fmt='%-7.2f')
# Writing out a break to indicate different slices...
outfile.write('# New slice\n')
Это дает:
# Array shape: (4, 5, 10)
0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00
10.00 11.00 12.00 13.00 14.00 15.00 16.00 17.00 18.00 19.00
20.00 21.00 22.00 23.00 24.00 25.00 26.00 27.00 28.00 29.00
30.00 31.00 32.00 33.00 34.00 35.00 36.00 37.00 38.00 39.00
40.00 41.00 42.00 43.00 44.00 45.00 46.00 47.00 48.00 49.00
# New slice
50.00 51.00 52.00 53.00 54.00 55.00 56.00 57.00 58.00 59.00
60.00 61.00 62.00 63.00 64.00 65.00 66.00 67.00 68.00 69.00
70.00 71.00 72.00 73.00 74.00 75.00 76.00 77.00 78.00 79.00
80.00 81.00 82.00 83.00 84.00 85.00 86.00 87.00 88.00 89.00
90.00 91.00 92.00 93.00 94.00 95.00 96.00 97.00 98.00 99.00
# New slice
100.00 101.00 102.00 103.00 104.00 105.00 106.00 107.00 108.00 109.00
110.00 111.00 112.00 113.00 114.00 115.00 116.00 117.00 118.00 119.00
120.00 121.00 122.00 123.00 124.00 125.00 126.00 127.00 128.00 129.00
130.00 131.00 132.00 133.00 134.00 135.00 136.00 137.00 138.00 139.00
140.00 141.00 142.00 143.00 144.00 145.00 146.00 147.00 148.00 149.00
# New slice
150.00 151.00 152.00 153.00 154.00 155.00 156.00 157.00 158.00 159.00
160.00 161.00 162.00 163.00 164.00 165.00 166.00 167.00 168.00 169.00
170.00 171.00 172.00 173.00 174.00 175.00 176.00 177.00 178.00 179.00
180.00 181.00 182.00 183.00 184.00 185.00 186.00 187.00 188.00 189.00
190.00 191.00 192.00 193.00 194.00 195.00 196.00 197.00 198.00 199.00
# New slice
Считать его обратно очень просто, если мы знаем форму исходного массива. Мы можем просто делать numpy.loadtxt('test.txt').reshape((4,5,10))
. В качестве примера (вы можете сделать это одной строкой, я просто подробно разъясняю ситуацию):
# Read the array from disk
new_data = np.loadtxt('test.txt')
# Note that this returned a 2D array!
print new_data.shape
# However, going back to 3D is easy if we know the
# original shape of the array
new_data = new_data.reshape((4,5,10))
# Just to check that they're the same...
assert np.all(new_data == data)
numpy.loadtxt
( docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html )