Nếu bạn muốn ghi nó vào đĩa để dễ dàng đọc lại dưới dạng một mảng phức tạp, hãy xem xét numpy.save
. Nhặt nó cũng sẽ hoạt động tốt, nhưng nó kém hiệu quả hơn đối với các mảng lớn (cái của bạn không có, vì vậy một trong hai cũng hoàn toàn ổn).
Nếu bạn muốn con người có thể đọc được, hãy xem xét numpy.savetxt
.
Chỉnh sửa: Vì vậy, có vẻ như savetxt
không phải là một lựa chọn tuyệt vời cho các mảng có> 2 kích thước ... Nhưng chỉ để rút ra mọi thứ cho nó kết luận đầy đủ:
Tôi chỉ nhận ra rằng numpy.savetxt
cuộn cảm trên ndarrays có nhiều hơn 2 kích thước ... Điều này có thể là do thiết kế, vì không có cách xác định nào để chỉ ra các kích thước bổ sung trong tệp văn bản.
Vd: Cái này (mảng 2D) hoạt động tốt
import numpy as np
x = np.arange(20).reshape((4,5))
np.savetxt('test.txt', x)
Mặc dù điều tương tự sẽ không thành công (với một lỗi khá không thông tin TypeError: float argument required, not numpy.ndarray
:) đối với mảng 3D:
import numpy as np
x = np.arange(200).reshape((4,5,10))
np.savetxt('test.txt', x)
Một cách giải quyết là chỉ chia mảng 3D (hoặc lớn hơn) thành các lát 2D. Ví dụ
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)
Tuy nhiên, mục tiêu của chúng tôi là con người có thể đọc được một cách rõ ràng, trong khi vẫn có thể dễ dàng đọc lại với numpy.loadtxt
. Do đó, chúng ta có thể dài dòng hơn một chút và phân biệt các lát cắt bằng cách sử dụng các dòng đã nhận xét. Theo mặc định, numpy.loadtxt
sẽ bỏ qua bất kỳ dòng nào bắt đầu bằng #
(hoặc bất kỳ ký tự nào được chỉ định bởi comments
kwarg). (Điều này trông dài dòng hơn so với thực tế ...)
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')
Điều này mang lại:
# 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
Đọc lại nó rất dễ dàng, miễn là chúng ta biết hình dạng của mảng ban đầu. Chúng tôi chỉ có thể làm numpy.loadtxt('test.txt').reshape((4,5,10))
. Ví dụ (Bạn có thể làm điều này trong một dòng, tôi chỉ nói dài dòng để làm rõ mọi thứ):
# 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 )