1
r''' Test the .npy file format.
6
>>> from cStringIO import StringIO
7
>>> from numpy.lib import format
27
>>> for scalar in scalars:
28
... for endian in '<>':
29
... dtype = np.dtype(scalar).newbyteorder(endian)
30
... basic = np.arange(15).astype(dtype)
31
... basic_arrays.extend([
32
... np.array([], dtype=dtype),
33
... np.array(10, dtype=dtype),
35
... basic.reshape((3,5)),
36
... basic.reshape((3,5)).T,
37
... basic.reshape((3,5))[::-1,::2],
42
... ('x', 'i4', (2,)),
43
... ('y', 'f8', (2, 2)),
48
... ([3,2], [[6.,4.],[6.,4.]], 8),
49
... ([4,3], [[7.,5.],[7.,5.]], 9),
54
... ('x', 'i4', (2,)),
60
... ('value', 'c16', (2,)),
61
... ('y3', 'f8', (2,)),
62
... ('z3', 'u4', (2,))]),
68
... ('Value', 'c16')]),
69
... ('y', 'f8', (2, 2)),
74
... ([3,2], (6j, 6., ('nn', [6j,4j], [6.,4.], [1,2]), 'NN', True), 'cc', ('NN', 6j), [[6.,4.],[6.,4.]], 8),
75
... ([4,3], (7j, 7., ('oo', [7j,5j], [7.,5.], [2,1]), 'OO', False), 'dd', ('OO', 7j), [[7.,5.],[7.,5.]], 9),
80
... np.array(PbufferT, dtype=np.dtype(Pdescr).newbyteorder('<')),
81
... np.array(NbufferT, dtype=np.dtype(Ndescr).newbyteorder('<')),
82
... np.array(PbufferT, dtype=np.dtype(Pdescr).newbyteorder('>')),
83
... np.array(NbufferT, dtype=np.dtype(Ndescr).newbyteorder('>')),
86
Test the magic string writing.
88
>>> format.magic(1, 0)
90
>>> format.magic(0, 0)
92
>>> format.magic(255, 255)
94
>>> format.magic(2, 5)
97
Test the magic string reading.
99
>>> format.read_magic(StringIO(format.magic(1, 0)))
101
>>> format.read_magic(StringIO(format.magic(0, 0)))
103
>>> format.read_magic(StringIO(format.magic(255, 255)))
105
>>> format.read_magic(StringIO(format.magic(2, 5)))
108
Test the header writing.
110
>>> for arr in basic_arrays + record_arrays:
112
... format.write_array_header_1_0(f, arr)
113
... print repr(f.getvalue())
115
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': (0,)} \n"
116
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': ()} \n"
117
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': (15,)} \n"
118
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': (3, 5)} \n"
119
"F\x00{'descr': '|u1', 'fortran_order': True, 'shape': (5, 3)} \n"
120
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': (3, 3)} \n"
121
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': (0,)} \n"
122
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': ()} \n"
123
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': (15,)} \n"
124
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': (3, 5)} \n"
125
"F\x00{'descr': '|u1', 'fortran_order': True, 'shape': (5, 3)} \n"
126
"F\x00{'descr': '|u1', 'fortran_order': False, 'shape': (3, 3)} \n"
127
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': (0,)} \n"
128
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': ()} \n"
129
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': (15,)} \n"
130
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': (3, 5)} \n"
131
"F\x00{'descr': '|i1', 'fortran_order': True, 'shape': (5, 3)} \n"
132
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': (3, 3)} \n"
133
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': (0,)} \n"
134
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': ()} \n"
135
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': (15,)} \n"
136
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': (3, 5)} \n"
137
"F\x00{'descr': '|i1', 'fortran_order': True, 'shape': (5, 3)} \n"
138
"F\x00{'descr': '|i1', 'fortran_order': False, 'shape': (3, 3)} \n"
139
"F\x00{'descr': '<u2', 'fortran_order': False, 'shape': (0,)} \n"
140
"F\x00{'descr': '<u2', 'fortran_order': False, 'shape': ()} \n"
141
"F\x00{'descr': '<u2', 'fortran_order': False, 'shape': (15,)} \n"
142
"F\x00{'descr': '<u2', 'fortran_order': False, 'shape': (3, 5)} \n"
143
"F\x00{'descr': '<u2', 'fortran_order': True, 'shape': (5, 3)} \n"
144
"F\x00{'descr': '<u2', 'fortran_order': False, 'shape': (3, 3)} \n"
145
"F\x00{'descr': '>u2', 'fortran_order': False, 'shape': (0,)} \n"
146
"F\x00{'descr': '>u2', 'fortran_order': False, 'shape': ()} \n"
147
"F\x00{'descr': '>u2', 'fortran_order': False, 'shape': (15,)} \n"
148
"F\x00{'descr': '>u2', 'fortran_order': False, 'shape': (3, 5)} \n"
149
"F\x00{'descr': '>u2', 'fortran_order': True, 'shape': (5, 3)} \n"
150
"F\x00{'descr': '>u2', 'fortran_order': False, 'shape': (3, 3)} \n"
151
"F\x00{'descr': '<i2', 'fortran_order': False, 'shape': (0,)} \n"
152
"F\x00{'descr': '<i2', 'fortran_order': False, 'shape': ()} \n"
153
"F\x00{'descr': '<i2', 'fortran_order': False, 'shape': (15,)} \n"
154
"F\x00{'descr': '<i2', 'fortran_order': False, 'shape': (3, 5)} \n"
155
"F\x00{'descr': '<i2', 'fortran_order': True, 'shape': (5, 3)} \n"
156
"F\x00{'descr': '<i2', 'fortran_order': False, 'shape': (3, 3)} \n"
157
"F\x00{'descr': '>i2', 'fortran_order': False, 'shape': (0,)} \n"
158
"F\x00{'descr': '>i2', 'fortran_order': False, 'shape': ()} \n"
159
"F\x00{'descr': '>i2', 'fortran_order': False, 'shape': (15,)} \n"
160
"F\x00{'descr': '>i2', 'fortran_order': False, 'shape': (3, 5)} \n"
161
"F\x00{'descr': '>i2', 'fortran_order': True, 'shape': (5, 3)} \n"
162
"F\x00{'descr': '>i2', 'fortran_order': False, 'shape': (3, 3)} \n"
163
"F\x00{'descr': '<u4', 'fortran_order': False, 'shape': (0,)} \n"
164
"F\x00{'descr': '<u4', 'fortran_order': False, 'shape': ()} \n"
165
"F\x00{'descr': '<u4', 'fortran_order': False, 'shape': (15,)} \n"
166
"F\x00{'descr': '<u4', 'fortran_order': False, 'shape': (3, 5)} \n"
167
"F\x00{'descr': '<u4', 'fortran_order': True, 'shape': (5, 3)} \n"
168
"F\x00{'descr': '<u4', 'fortran_order': False, 'shape': (3, 3)} \n"
169
"F\x00{'descr': '>u4', 'fortran_order': False, 'shape': (0,)} \n"
170
"F\x00{'descr': '>u4', 'fortran_order': False, 'shape': ()} \n"
171
"F\x00{'descr': '>u4', 'fortran_order': False, 'shape': (15,)} \n"
172
"F\x00{'descr': '>u4', 'fortran_order': False, 'shape': (3, 5)} \n"
173
"F\x00{'descr': '>u4', 'fortran_order': True, 'shape': (5, 3)} \n"
174
"F\x00{'descr': '>u4', 'fortran_order': False, 'shape': (3, 3)} \n"
175
"F\x00{'descr': '<i4', 'fortran_order': False, 'shape': (0,)} \n"
176
"F\x00{'descr': '<i4', 'fortran_order': False, 'shape': ()} \n"
177
"F\x00{'descr': '<i4', 'fortran_order': False, 'shape': (15,)} \n"
178
"F\x00{'descr': '<i4', 'fortran_order': False, 'shape': (3, 5)} \n"
179
"F\x00{'descr': '<i4', 'fortran_order': True, 'shape': (5, 3)} \n"
180
"F\x00{'descr': '<i4', 'fortran_order': False, 'shape': (3, 3)} \n"
181
"F\x00{'descr': '>i4', 'fortran_order': False, 'shape': (0,)} \n"
182
"F\x00{'descr': '>i4', 'fortran_order': False, 'shape': ()} \n"
183
"F\x00{'descr': '>i4', 'fortran_order': False, 'shape': (15,)} \n"
184
"F\x00{'descr': '>i4', 'fortran_order': False, 'shape': (3, 5)} \n"
185
"F\x00{'descr': '>i4', 'fortran_order': True, 'shape': (5, 3)} \n"
186
"F\x00{'descr': '>i4', 'fortran_order': False, 'shape': (3, 3)} \n"
187
"F\x00{'descr': '<u8', 'fortran_order': False, 'shape': (0,)} \n"
188
"F\x00{'descr': '<u8', 'fortran_order': False, 'shape': ()} \n"
189
"F\x00{'descr': '<u8', 'fortran_order': False, 'shape': (15,)} \n"
190
"F\x00{'descr': '<u8', 'fortran_order': False, 'shape': (3, 5)} \n"
191
"F\x00{'descr': '<u8', 'fortran_order': True, 'shape': (5, 3)} \n"
192
"F\x00{'descr': '<u8', 'fortran_order': False, 'shape': (3, 3)} \n"
193
"F\x00{'descr': '>u8', 'fortran_order': False, 'shape': (0,)} \n"
194
"F\x00{'descr': '>u8', 'fortran_order': False, 'shape': ()} \n"
195
"F\x00{'descr': '>u8', 'fortran_order': False, 'shape': (15,)} \n"
196
"F\x00{'descr': '>u8', 'fortran_order': False, 'shape': (3, 5)} \n"
197
"F\x00{'descr': '>u8', 'fortran_order': True, 'shape': (5, 3)} \n"
198
"F\x00{'descr': '>u8', 'fortran_order': False, 'shape': (3, 3)} \n"
199
"F\x00{'descr': '<i8', 'fortran_order': False, 'shape': (0,)} \n"
200
"F\x00{'descr': '<i8', 'fortran_order': False, 'shape': ()} \n"
201
"F\x00{'descr': '<i8', 'fortran_order': False, 'shape': (15,)} \n"
202
"F\x00{'descr': '<i8', 'fortran_order': False, 'shape': (3, 5)} \n"
203
"F\x00{'descr': '<i8', 'fortran_order': True, 'shape': (5, 3)} \n"
204
"F\x00{'descr': '<i8', 'fortran_order': False, 'shape': (3, 3)} \n"
205
"F\x00{'descr': '>i8', 'fortran_order': False, 'shape': (0,)} \n"
206
"F\x00{'descr': '>i8', 'fortran_order': False, 'shape': ()} \n"
207
"F\x00{'descr': '>i8', 'fortran_order': False, 'shape': (15,)} \n"
208
"F\x00{'descr': '>i8', 'fortran_order': False, 'shape': (3, 5)} \n"
209
"F\x00{'descr': '>i8', 'fortran_order': True, 'shape': (5, 3)} \n"
210
"F\x00{'descr': '>i8', 'fortran_order': False, 'shape': (3, 3)} \n"
211
"F\x00{'descr': '<f4', 'fortran_order': False, 'shape': (0,)} \n"
212
"F\x00{'descr': '<f4', 'fortran_order': False, 'shape': ()} \n"
213
"F\x00{'descr': '<f4', 'fortran_order': False, 'shape': (15,)} \n"
214
"F\x00{'descr': '<f4', 'fortran_order': False, 'shape': (3, 5)} \n"
215
"F\x00{'descr': '<f4', 'fortran_order': True, 'shape': (5, 3)} \n"
216
"F\x00{'descr': '<f4', 'fortran_order': False, 'shape': (3, 3)} \n"
217
"F\x00{'descr': '>f4', 'fortran_order': False, 'shape': (0,)} \n"
218
"F\x00{'descr': '>f4', 'fortran_order': False, 'shape': ()} \n"
219
"F\x00{'descr': '>f4', 'fortran_order': False, 'shape': (15,)} \n"
220
"F\x00{'descr': '>f4', 'fortran_order': False, 'shape': (3, 5)} \n"
221
"F\x00{'descr': '>f4', 'fortran_order': True, 'shape': (5, 3)} \n"
222
"F\x00{'descr': '>f4', 'fortran_order': False, 'shape': (3, 3)} \n"
223
"F\x00{'descr': '<f8', 'fortran_order': False, 'shape': (0,)} \n"
224
"F\x00{'descr': '<f8', 'fortran_order': False, 'shape': ()} \n"
225
"F\x00{'descr': '<f8', 'fortran_order': False, 'shape': (15,)} \n"
226
"F\x00{'descr': '<f8', 'fortran_order': False, 'shape': (3, 5)} \n"
227
"F\x00{'descr': '<f8', 'fortran_order': True, 'shape': (5, 3)} \n"
228
"F\x00{'descr': '<f8', 'fortran_order': False, 'shape': (3, 3)} \n"
229
"F\x00{'descr': '>f8', 'fortran_order': False, 'shape': (0,)} \n"
230
"F\x00{'descr': '>f8', 'fortran_order': False, 'shape': ()} \n"
231
"F\x00{'descr': '>f8', 'fortran_order': False, 'shape': (15,)} \n"
232
"F\x00{'descr': '>f8', 'fortran_order': False, 'shape': (3, 5)} \n"
233
"F\x00{'descr': '>f8', 'fortran_order': True, 'shape': (5, 3)} \n"
234
"F\x00{'descr': '>f8', 'fortran_order': False, 'shape': (3, 3)} \n"
235
"F\x00{'descr': '<c8', 'fortran_order': False, 'shape': (0,)} \n"
236
"F\x00{'descr': '<c8', 'fortran_order': False, 'shape': ()} \n"
237
"F\x00{'descr': '<c8', 'fortran_order': False, 'shape': (15,)} \n"
238
"F\x00{'descr': '<c8', 'fortran_order': False, 'shape': (3, 5)} \n"
239
"F\x00{'descr': '<c8', 'fortran_order': True, 'shape': (5, 3)} \n"
240
"F\x00{'descr': '<c8', 'fortran_order': False, 'shape': (3, 3)} \n"
241
"F\x00{'descr': '>c8', 'fortran_order': False, 'shape': (0,)} \n"
242
"F\x00{'descr': '>c8', 'fortran_order': False, 'shape': ()} \n"
243
"F\x00{'descr': '>c8', 'fortran_order': False, 'shape': (15,)} \n"
244
"F\x00{'descr': '>c8', 'fortran_order': False, 'shape': (3, 5)} \n"
245
"F\x00{'descr': '>c8', 'fortran_order': True, 'shape': (5, 3)} \n"
246
"F\x00{'descr': '>c8', 'fortran_order': False, 'shape': (3, 3)} \n"
247
"F\x00{'descr': '<c16', 'fortran_order': False, 'shape': (0,)} \n"
248
"F\x00{'descr': '<c16', 'fortran_order': False, 'shape': ()} \n"
249
"F\x00{'descr': '<c16', 'fortran_order': False, 'shape': (15,)} \n"
250
"F\x00{'descr': '<c16', 'fortran_order': False, 'shape': (3, 5)} \n"
251
"F\x00{'descr': '<c16', 'fortran_order': True, 'shape': (5, 3)} \n"
252
"F\x00{'descr': '<c16', 'fortran_order': False, 'shape': (3, 3)} \n"
253
"F\x00{'descr': '>c16', 'fortran_order': False, 'shape': (0,)} \n"
254
"F\x00{'descr': '>c16', 'fortran_order': False, 'shape': ()} \n"
255
"F\x00{'descr': '>c16', 'fortran_order': False, 'shape': (15,)} \n"
256
"F\x00{'descr': '>c16', 'fortran_order': False, 'shape': (3, 5)} \n"
257
"F\x00{'descr': '>c16', 'fortran_order': True, 'shape': (5, 3)} \n"
258
"F\x00{'descr': '>c16', 'fortran_order': False, 'shape': (3, 3)} \n"
259
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': (0,)} \n"
260
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': ()} \n"
261
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': (15,)} \n"
262
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': (3, 5)} \n"
263
"F\x00{'descr': '|O4', 'fortran_order': True, 'shape': (5, 3)} \n"
264
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': (3, 3)} \n"
265
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': (0,)} \n"
266
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': ()} \n"
267
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': (15,)} \n"
268
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': (3, 5)} \n"
269
"F\x00{'descr': '|O4', 'fortran_order': True, 'shape': (5, 3)} \n"
270
"F\x00{'descr': '|O4', 'fortran_order': False, 'shape': (3, 3)} \n"
271
"v\x00{'descr': [('x', '<i4', (2,)), ('y', '<f8', (2, 2)), ('z', '|u1')],\n 'fortran_order': False,\n 'shape': (2,)} \n"
272
"\x16\x02{'descr': [('x', '<i4', (2,)),\n ('Info',\n [('value', '<c16'),\n ('y2', '<f8'),\n ('Info2',\n [('name', '|S2'),\n ('value', '<c16', (2,)),\n ('y3', '<f8', (2,)),\n ('z3', '<u4', (2,))]),\n ('name', '|S2'),\n ('z2', '|b1')]),\n ('color', '|S2'),\n ('info', [('Name', '<U8'), ('Value', '<c16')]),\n ('y', '<f8', (2, 2)),\n ('z', '|u1')],\n 'fortran_order': False,\n 'shape': (2,)} \n"
273
"v\x00{'descr': [('x', '>i4', (2,)), ('y', '>f8', (2, 2)), ('z', '|u1')],\n 'fortran_order': False,\n 'shape': (2,)} \n"
274
"\x16\x02{'descr': [('x', '>i4', (2,)),\n ('Info',\n [('value', '>c16'),\n ('y2', '>f8'),\n ('Info2',\n [('name', '|S2'),\n ('value', '>c16', (2,)),\n ('y3', '>f8', (2,)),\n ('z3', '>u4', (2,))]),\n ('name', '|S2'),\n ('z2', '|b1')]),\n ('color', '|S2'),\n ('info', [('Name', '>U8'), ('Value', '>c16')]),\n ('y', '>f8', (2, 2)),\n ('z', '|u1')],\n 'fortran_order': False,\n 'shape': (2,)} \n"
278
from cStringIO import StringIO
284
from numpy.testing import assert_array_equal, raises
286
from numpy.lib import format
291
# Module-level setup.
294
tempdir = tempfile.mkdtemp()
296
def teardown_module():
298
if tempdir is not None and os.path.isdir(tempdir):
299
shutil.rmtree(tempdir)
303
# Generate some basic arrays to test with.
320
for scalar in scalars:
322
dtype = np.dtype(scalar).newbyteorder(endian)
323
basic = np.arange(15).astype(dtype)
324
basic_arrays.extend([
326
np.array([], dtype=dtype),
328
np.array(10, dtype=dtype),
332
basic.reshape((3,5)),
334
basic.reshape((3,5)).T,
336
basic.reshape((3,5))[::-1,::2],
339
# More complicated record arrays.
340
# This is the structure of the table used for plain objects:
346
# Structure of a plain array description:
352
# A plain list of tuples with values for testing:
355
([3,2], [[6.,4.],[6.,4.]], 8),
356
([4,3], [[7.,5.],[7.,5.]], 9),
360
# This is the structure of the table used for nested objects (DON'T PANIC!):
362
# +-+---------------------------------+-----+----------+-+-+
363
# |x|Info |color|info |y|z|
364
# | +-----+--+----------------+----+--+ +----+-----+ | |
365
# | |value|y2|Info2 |name|z2| |Name|Value| | |
366
# | | | +----+-----+--+--+ | | | | | | |
367
# | | | |name|value|y3|z3| | | | | | | |
368
# +-+-----+--+----+-----+--+--+----+--+-----+----+-----+-+-+
371
# The corresponding nested array description:
379
('value', 'c16', (2,)),
381
('z3', 'u4', (2,))]),
392
# x Info color info y z
393
# value y2 Info2 name z2 Name Value
395
([3,2], (6j, 6., ('nn', [6j,4j], [6.,4.], [1,2]), 'NN', True), 'cc', ('NN', 6j), [[6.,4.],[6.,4.]], 8),
396
([4,3], (7j, 7., ('oo', [7j,5j], [7.,5.], [2,1]), 'OO', False), 'dd', ('OO', 7j), [[7.,5.],[7.,5.]], 9),
400
np.array(PbufferT, dtype=np.dtype(Pdescr).newbyteorder('<')),
401
np.array(NbufferT, dtype=np.dtype(Ndescr).newbyteorder('<')),
402
np.array(PbufferT, dtype=np.dtype(Pdescr).newbyteorder('>')),
403
np.array(NbufferT, dtype=np.dtype(Ndescr).newbyteorder('>')),
408
format.write_array(f, arr)
409
f2 = StringIO(f.getvalue())
410
arr2 = format.read_array(f2)
413
def assert_equal(o1, o2):
417
def test_roundtrip():
418
for arr in basic_arrays + record_arrays:
419
arr2 = roundtrip(arr)
420
yield assert_array_equal, arr, arr2
422
def test_memmap_roundtrip():
423
for arr in basic_arrays + record_arrays:
424
if arr.dtype.hasobject:
425
# Skip these since they can't be mmap'ed.
427
# Write it out normally and through mmap.
428
nfn = os.path.join(tempdir, 'normal.npy')
429
mfn = os.path.join(tempdir, 'memmap.npy')
432
format.write_array(fp, arr)
436
fortran_order = (arr.flags.f_contiguous and not arr.flags.c_contiguous)
437
ma = format.open_memmap(mfn, mode='w+', dtype=arr.dtype,
438
shape=arr.shape, fortran_order=fortran_order)
442
# Check that both of these files' contents are the same.
444
normal_bytes = fp.read()
447
memmap_bytes = fp.read()
449
yield assert_equal, normal_bytes, memmap_bytes
451
# Check that reading the file using memmap works.
452
ma = format.open_memmap(nfn, mode='r')
453
yield assert_array_equal, ma, arr
457
def test_write_version_1_0():
461
format.write_array(f, arr, version=(1, 0))
462
format.write_array(f, arr)
464
# These should all fail.
473
for version in bad_versions:
475
format.write_array(f, arr, version=version)
479
raise AssertionError("we should have raised a ValueError for the bad version %r" % (version,))
482
bad_version_magic = [
500
def test_read_magic_bad_magic():
501
for magic in malformed_magic:
503
yield raises(ValueError)(format.read_magic), f
505
def test_read_version_1_0_bad_magic():
506
for magic in bad_version_magic + malformed_magic:
508
yield raises(ValueError)(format.read_array), f