Если вы хотите записать его на диск, чтобы его можно было легко считывать в виде массива numpy, посмотрите на numpy.save
. Распиловка также будет работать отлично, но она менее эффективна для больших массивов (чего у вас нет, так и отлично).
Если вы хотите, чтобы это был человек, читаемый, просмотрите numpy.savetxt
.
Edit: Так, похоже, savetxt
не столь большой вариант для массивов с> 2-х измерениях ... Но просто сделать все, чтобы это полный вывод:
Я просто понял, что numpy.savetxt
дроссели на ndarrays с более чем 2-мя измерениями ... Это, по-видимому, по дизайну, так как нет никакого определенного способа указать дополнительные размеры в текстовом файле.
E.g. Это (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)
Один из способов является просто сломать 3D (или больше) в двумерные срезы. Например.
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 file('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)
Извините, перечитайте свой вопрос после отправки моего ответа и предположите, что он не отвечает вашим потребностям - если это не так, напишите мне, и я отправлю альтернативу. (Хорошо видеть вас в этой части экс-квадрилогии btw!) –
На самом деле - похоже, ответ Джо Кингтона должен работать на вас. –