Якщо ви хочете записати його на диск, щоб його було легко прочитати у вигляді нумерованого масиву, погляньте на це 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)
Одне вирішення полягає лише в тому, щоб розбити 3D (або більше) масив на 2D фрагменти. Напр
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 )