comparison DEPENDENCIES/mingw32/Python27/Lib/site-packages/numpy/ma/timer_comparison.py @ 87:2a2c65a20a8b

Add Python libs and headers
author Chris Cannam
date Wed, 25 Feb 2015 14:05:22 +0000
parents
children
comparison
equal deleted inserted replaced
86:413a9d26189e 87:2a2c65a20a8b
1 from __future__ import division, absolute_import, print_function
2
3 import timeit
4 from functools import reduce
5
6 import numpy as np
7 from numpy import float_
8 import np.core.fromnumeric as fromnumeric
9
10 from np.testing.utils import build_err_msg
11
12 # Fixme: this does not look right.
13 np.seterr(all='ignore')
14
15 pi = np.pi
16
17
18 class moduletester(object):
19 def __init__(self, module):
20 self.module = module
21 self.allequal = module.allequal
22 self.arange = module.arange
23 self.array = module.array
24 # self.average = module.average
25 self.concatenate = module.concatenate
26 self.count = module.count
27 self.equal = module.equal
28 self.filled = module.filled
29 self.getmask = module.getmask
30 self.getmaskarray = module.getmaskarray
31 self.id = id
32 self.inner = module.inner
33 self.make_mask = module.make_mask
34 self.masked = module.masked
35 self.masked_array = module.masked_array
36 self.masked_values = module.masked_values
37 self.mask_or = module.mask_or
38 self.nomask = module.nomask
39 self.ones = module.ones
40 self.outer = module.outer
41 self.repeat = module.repeat
42 self.resize = module.resize
43 self.sort = module.sort
44 self.take = module.take
45 self.transpose = module.transpose
46 self.zeros = module.zeros
47 self.MaskType = module.MaskType
48 try:
49 self.umath = module.umath
50 except AttributeError:
51 self.umath = module.core.umath
52 self.testnames = []
53
54 def assert_array_compare(self, comparison, x, y, err_msg='', header='',
55 fill_value=True):
56 """Asserts that a comparison relation between two masked arrays is satisfied
57 elementwise."""
58 xf = self.filled(x)
59 yf = self.filled(y)
60 m = self.mask_or(self.getmask(x), self.getmask(y))
61
62 x = self.filled(self.masked_array(xf, mask=m), fill_value)
63 y = self.filled(self.masked_array(yf, mask=m), fill_value)
64 if (x.dtype.char != "O"):
65 x = x.astype(float_)
66 if isinstance(x, np.ndarray) and x.size > 1:
67 x[np.isnan(x)] = 0
68 elif np.isnan(x):
69 x = 0
70 if (y.dtype.char != "O"):
71 y = y.astype(float_)
72 if isinstance(y, np.ndarray) and y.size > 1:
73 y[np.isnan(y)] = 0
74 elif np.isnan(y):
75 y = 0
76 try:
77 cond = (x.shape==() or y.shape==()) or x.shape == y.shape
78 if not cond:
79 msg = build_err_msg([x, y],
80 err_msg
81 + '\n(shapes %s, %s mismatch)' % (x.shape,
82 y.shape),
83 header=header,
84 names=('x', 'y'))
85 assert cond, msg
86 val = comparison(x, y)
87 if m is not self.nomask and fill_value:
88 val = self.masked_array(val, mask=m)
89 if isinstance(val, bool):
90 cond = val
91 reduced = [0]
92 else:
93 reduced = val.ravel()
94 cond = reduced.all()
95 reduced = reduced.tolist()
96 if not cond:
97 match = 100-100.0*reduced.count(1)/len(reduced)
98 msg = build_err_msg([x, y],
99 err_msg
100 + '\n(mismatch %s%%)' % (match,),
101 header=header,
102 names=('x', 'y'))
103 assert cond, msg
104 except ValueError:
105 msg = build_err_msg([x, y], err_msg, header=header, names=('x', 'y'))
106 raise ValueError(msg)
107
108 def assert_array_equal(self, x, y, err_msg=''):
109 """Checks the elementwise equality of two masked arrays."""
110 self.assert_array_compare(self.equal, x, y, err_msg=err_msg,
111 header='Arrays are not equal')
112
113 def test_0(self):
114 "Tests creation"
115 x = np.array([1., 1., 1., -2., pi/2.0, 4., 5., -10., 10., 1., 2., 3.])
116 m = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
117 xm = self.masked_array(x, mask=m)
118 xm[0]
119
120 def test_1(self):
121 "Tests creation"
122 x = np.array([1., 1., 1., -2., pi/2.0, 4., 5., -10., 10., 1., 2., 3.])
123 y = np.array([5., 0., 3., 2., -1., -4., 0., -10., 10., 1., 0., 3.])
124 a10 = 10.
125 m1 = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
126 m2 = [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1]
127 xm = self.masked_array(x, mask=m1)
128 ym = self.masked_array(y, mask=m2)
129 z = np.array([-.5, 0., .5, .8])
130 zm = self.masked_array(z, mask=[0, 1, 0, 0])
131 xf = np.where(m1, 1.e+20, x)
132 xm.set_fill_value(1.e+20)
133
134 assert((xm-ym).filled(0).any())
135 #fail_if_equal(xm.mask.astype(int_), ym.mask.astype(int_))
136 s = x.shape
137 assert(xm.size == reduce(lambda x, y:x*y, s))
138 assert(self.count(xm) == len(m1) - reduce(lambda x, y:x+y, m1))
139
140 for s in [(4, 3), (6, 2)]:
141 x.shape = s
142 y.shape = s
143 xm.shape = s
144 ym.shape = s
145 xf.shape = s
146
147 assert(self.count(xm) == len(m1) - reduce(lambda x, y:x+y, m1))
148
149 def test_2(self):
150 "Tests conversions and indexing"
151 x1 = np.array([1, 2, 4, 3])
152 x2 = self.array(x1, mask=[1, 0, 0, 0])
153 x3 = self.array(x1, mask=[0, 1, 0, 1])
154 x4 = self.array(x1)
155 # test conversion to strings
156 junk, garbage = str(x2), repr(x2)
157 # assert_equal(np.sort(x1), self.sort(x2, fill_value=0))
158 # tests of indexing
159 assert type(x2[1]) is type(x1[1])
160 assert x1[1] == x2[1]
161 # assert self.allequal(x1[2],x2[2])
162 # assert self.allequal(x1[2:5],x2[2:5])
163 # assert self.allequal(x1[:],x2[:])
164 # assert self.allequal(x1[1:], x3[1:])
165 x1[2] = 9
166 x2[2] = 9
167 self.assert_array_equal(x1, x2)
168 x1[1:3] = 99
169 x2[1:3] = 99
170 # assert self.allequal(x1,x2)
171 x2[1] = self.masked
172 # assert self.allequal(x1,x2)
173 x2[1:3] = self.masked
174 # assert self.allequal(x1,x2)
175 x2[:] = x1
176 x2[1] = self.masked
177 # assert self.allequal(self.getmask(x2),self.array([0,1,0,0]))
178 x3[:] = self.masked_array([1, 2, 3, 4], [0, 1, 1, 0])
179 # assert self.allequal(self.getmask(x3), self.array([0,1,1,0]))
180 x4[:] = self.masked_array([1, 2, 3, 4], [0, 1, 1, 0])
181 # assert self.allequal(self.getmask(x4), self.array([0,1,1,0]))
182 # assert self.allequal(x4, self.array([1,2,3,4]))
183 x1 = np.arange(5)*1.0
184 x2 = self.masked_values(x1, 3.0)
185 # assert self.allequal(x1,x2)
186 # assert self.allequal(self.array([0,0,0,1,0], self.MaskType), x2.mask)
187 x1 = self.array([1, 'hello', 2, 3], object)
188 x2 = np.array([1, 'hello', 2, 3], object)
189 s1 = x1[1]
190 s2 = x2[1]
191 assert x1[1:1].shape == (0,)
192 # Tests copy-size
193 n = [0, 0, 1, 0, 0]
194 m = self.make_mask(n)
195 m2 = self.make_mask(m)
196 assert(m is m2)
197 m3 = self.make_mask(m, copy=1)
198 assert(m is not m3)
199
200
201 def test_3(self):
202 "Tests resize/repeat"
203 x4 = self.arange(4)
204 x4[2] = self.masked
205 y4 = self.resize(x4, (8,))
206 assert self.allequal(self.concatenate([x4, x4]), y4)
207 assert self.allequal(self.getmask(y4), [0, 0, 1, 0, 0, 0, 1, 0])
208 y5 = self.repeat(x4, (2, 2, 2, 2), axis=0)
209 self.assert_array_equal(y5, [0, 0, 1, 1, 2, 2, 3, 3])
210 y6 = self.repeat(x4, 2, axis=0)
211 assert self.allequal(y5, y6)
212 y7 = x4.repeat((2, 2, 2, 2), axis=0)
213 assert self.allequal(y5, y7)
214 y8 = x4.repeat(2, 0)
215 assert self.allequal(y5, y8)
216
217 #----------------------------------
218 def test_4(self):
219 "Test of take, transpose, inner, outer products"
220 x = self.arange(24)
221 y = np.arange(24)
222 x[5:6] = self.masked
223 x = x.reshape(2, 3, 4)
224 y = y.reshape(2, 3, 4)
225 assert self.allequal(np.transpose(y, (2, 0, 1)), self.transpose(x, (2, 0, 1)))
226 assert self.allequal(np.take(y, (2, 0, 1), 1), self.take(x, (2, 0, 1), 1))
227 assert self.allequal(np.inner(self.filled(x, 0), self.filled(y, 0)),
228 self.inner(x, y))
229 assert self.allequal(np.outer(self.filled(x, 0), self.filled(y, 0)),
230 self.outer(x, y))
231 y = self.array(['abc', 1, 'def', 2, 3], object)
232 y[2] = self.masked
233 t = self.take(y, [0, 3, 4])
234 assert t[0] == 'abc'
235 assert t[1] == 2
236 assert t[2] == 3
237 #----------------------------------
238 def test_5(self):
239 "Tests inplace w/ scalar"
240
241 x = self.arange(10)
242 y = self.arange(10)
243 xm = self.arange(10)
244 xm[2] = self.masked
245 x += 1
246 assert self.allequal(x, y+1)
247 xm += 1
248 assert self.allequal(xm, y+1)
249
250 x = self.arange(10)
251 xm = self.arange(10)
252 xm[2] = self.masked
253 x -= 1
254 assert self.allequal(x, y-1)
255 xm -= 1
256 assert self.allequal(xm, y-1)
257
258 x = self.arange(10)*1.0
259 xm = self.arange(10)*1.0
260 xm[2] = self.masked
261 x *= 2.0
262 assert self.allequal(x, y*2)
263 xm *= 2.0
264 assert self.allequal(xm, y*2)
265
266 x = self.arange(10)*2
267 xm = self.arange(10)*2
268 xm[2] = self.masked
269 x /= 2
270 assert self.allequal(x, y)
271 xm /= 2
272 assert self.allequal(xm, y)
273
274 x = self.arange(10)*1.0
275 xm = self.arange(10)*1.0
276 xm[2] = self.masked
277 x /= 2.0
278 assert self.allequal(x, y/2.0)
279 xm /= self.arange(10)
280 self.assert_array_equal(xm, self.ones((10,)))
281
282 x = self.arange(10).astype(float_)
283 xm = self.arange(10)
284 xm[2] = self.masked
285 id1 = self.id(x.raw_data())
286 x += 1.
287 #assert id1 == self.id(x.raw_data())
288 assert self.allequal(x, y+1.)
289
290
291 def test_6(self):
292 "Tests inplace w/ array"
293
294 x = self.arange(10, dtype=float_)
295 y = self.arange(10)
296 xm = self.arange(10, dtype=float_)
297 xm[2] = self.masked
298 m = xm.mask
299 a = self.arange(10, dtype=float_)
300 a[-1] = self.masked
301 x += a
302 xm += a
303 assert self.allequal(x, y+a)
304 assert self.allequal(xm, y+a)
305 assert self.allequal(xm.mask, self.mask_or(m, a.mask))
306
307 x = self.arange(10, dtype=float_)
308 xm = self.arange(10, dtype=float_)
309 xm[2] = self.masked
310 m = xm.mask
311 a = self.arange(10, dtype=float_)
312 a[-1] = self.masked
313 x -= a
314 xm -= a
315 assert self.allequal(x, y-a)
316 assert self.allequal(xm, y-a)
317 assert self.allequal(xm.mask, self.mask_or(m, a.mask))
318
319 x = self.arange(10, dtype=float_)
320 xm = self.arange(10, dtype=float_)
321 xm[2] = self.masked
322 m = xm.mask
323 a = self.arange(10, dtype=float_)
324 a[-1] = self.masked
325 x *= a
326 xm *= a
327 assert self.allequal(x, y*a)
328 assert self.allequal(xm, y*a)
329 assert self.allequal(xm.mask, self.mask_or(m, a.mask))
330
331 x = self.arange(10, dtype=float_)
332 xm = self.arange(10, dtype=float_)
333 xm[2] = self.masked
334 m = xm.mask
335 a = self.arange(10, dtype=float_)
336 a[-1] = self.masked
337 x /= a
338 xm /= a
339
340 #----------------------------------
341 def test_7(self):
342 "Tests ufunc"
343 d = (self.array([1.0, 0, -1, pi/2]*2, mask=[0, 1]+[0]*6),
344 self.array([1.0, 0, -1, pi/2]*2, mask=[1, 0]+[0]*6),)
345 for f in ['sqrt', 'log', 'log10', 'exp', 'conjugate',
346 # 'sin', 'cos', 'tan',
347 # 'arcsin', 'arccos', 'arctan',
348 # 'sinh', 'cosh', 'tanh',
349 # 'arcsinh',
350 # 'arccosh',
351 # 'arctanh',
352 # 'absolute', 'fabs', 'negative',
353 # # 'nonzero', 'around',
354 # 'floor', 'ceil',
355 # # 'sometrue', 'alltrue',
356 # 'logical_not',
357 # 'add', 'subtract', 'multiply',
358 # 'divide', 'true_divide', 'floor_divide',
359 # 'remainder', 'fmod', 'hypot', 'arctan2',
360 # 'equal', 'not_equal', 'less_equal', 'greater_equal',
361 # 'less', 'greater',
362 # 'logical_and', 'logical_or', 'logical_xor',
363 ]:
364 #print f
365 try:
366 uf = getattr(self.umath, f)
367 except AttributeError:
368 uf = getattr(fromnumeric, f)
369 mf = getattr(self.module, f)
370 args = d[:uf.nin]
371 ur = uf(*args)
372 mr = mf(*args)
373 self.assert_array_equal(ur.filled(0), mr.filled(0), f)
374 self.assert_array_equal(ur._mask, mr._mask)
375
376 #----------------------------------
377 def test_99(self):
378 # test average
379 ott = self.array([0., 1., 2., 3.], mask=[1, 0, 0, 0])
380 self.assert_array_equal(2.0, self.average(ott, axis=0))
381 self.assert_array_equal(2.0, self.average(ott, weights=[1., 1., 2., 1.]))
382 result, wts = self.average(ott, weights=[1., 1., 2., 1.], returned=1)
383 self.assert_array_equal(2.0, result)
384 assert(wts == 4.0)
385 ott[:] = self.masked
386 assert(self.average(ott, axis=0) is self.masked)
387 ott = self.array([0., 1., 2., 3.], mask=[1, 0, 0, 0])
388 ott = ott.reshape(2, 2)
389 ott[:, 1] = self.masked
390 self.assert_array_equal(self.average(ott, axis=0), [2.0, 0.0])
391 assert(self.average(ott, axis=1)[0] is self.masked)
392 self.assert_array_equal([2., 0.], self.average(ott, axis=0))
393 result, wts = self.average(ott, axis=0, returned=1)
394 self.assert_array_equal(wts, [1., 0.])
395 w1 = [0, 1, 1, 1, 1, 0]
396 w2 = [[0, 1, 1, 1, 1, 0], [1, 0, 0, 0, 0, 1]]
397 x = self.arange(6)
398 self.assert_array_equal(self.average(x, axis=0), 2.5)
399 self.assert_array_equal(self.average(x, axis=0, weights=w1), 2.5)
400 y = self.array([self.arange(6), 2.0*self.arange(6)])
401 self.assert_array_equal(self.average(y, None), np.add.reduce(np.arange(6))*3./12.)
402 self.assert_array_equal(self.average(y, axis=0), np.arange(6) * 3./2.)
403 self.assert_array_equal(self.average(y, axis=1), [self.average(x, axis=0), self.average(x, axis=0) * 2.0])
404 self.assert_array_equal(self.average(y, None, weights=w2), 20./6.)
405 self.assert_array_equal(self.average(y, axis=0, weights=w2), [0., 1., 2., 3., 4., 10.])
406 self.assert_array_equal(self.average(y, axis=1), [self.average(x, axis=0), self.average(x, axis=0) * 2.0])
407 m1 = self.zeros(6)
408 m2 = [0, 0, 1, 1, 0, 0]
409 m3 = [[0, 0, 1, 1, 0, 0], [0, 1, 1, 1, 1, 0]]
410 m4 = self.ones(6)
411 m5 = [0, 1, 1, 1, 1, 1]
412 self.assert_array_equal(self.average(self.masked_array(x, m1), axis=0), 2.5)
413 self.assert_array_equal(self.average(self.masked_array(x, m2), axis=0), 2.5)
414 # assert(self.average(masked_array(x, m4),axis=0) is masked)
415 self.assert_array_equal(self.average(self.masked_array(x, m5), axis=0), 0.0)
416 self.assert_array_equal(self.count(self.average(self.masked_array(x, m4), axis=0)), 0)
417 z = self.masked_array(y, m3)
418 self.assert_array_equal(self.average(z, None), 20./6.)
419 self.assert_array_equal(self.average(z, axis=0), [0., 1., 99., 99., 4.0, 7.5])
420 self.assert_array_equal(self.average(z, axis=1), [2.5, 5.0])
421 self.assert_array_equal(self.average(z, axis=0, weights=w2), [0., 1., 99., 99., 4.0, 10.0])
422 #------------------------
423 def test_A(self):
424 x = self.arange(24)
425 y = np.arange(24)
426 x[5:6] = self.masked
427 x = x.reshape(2, 3, 4)
428
429
430 ################################################################################
431 if __name__ == '__main__':
432
433 setup_base = "from __main__ import moduletester \n"\
434 "import numpy\n" \
435 "tester = moduletester(module)\n"
436 # setup_new = "import np.ma.core_ini as module\n"+setup_base
437 setup_cur = "import np.ma.core as module\n"+setup_base
438 # setup_alt = "import np.ma.core_alt as module\n"+setup_base
439 # setup_tmp = "import np.ma.core_tmp as module\n"+setup_base
440
441 (nrepeat, nloop) = (10, 10)
442
443 if 1:
444 for i in range(1, 8):
445 func = 'tester.test_%i()' % i
446 # new = timeit.Timer(func, setup_new).repeat(nrepeat, nloop*10)
447 cur = timeit.Timer(func, setup_cur).repeat(nrepeat, nloop*10)
448 # alt = timeit.Timer(func, setup_alt).repeat(nrepeat, nloop*10)
449 # tmp = timeit.Timer(func, setup_tmp).repeat(nrepeat, nloop*10)
450 # new = np.sort(new)
451 cur = np.sort(cur)
452 # alt = np.sort(alt)
453 # tmp = np.sort(tmp)
454 print("#%i" % i +50*'.')
455 print(eval("moduletester.test_%i.__doc__" % i))
456 # print "core_ini : %.3f - %.3f" % (new[0], new[1])
457 print("core_current : %.3f - %.3f" % (cur[0], cur[1]))
458 # print "core_alt : %.3f - %.3f" % (alt[0], alt[1])
459 # print "core_tmp : %.3f - %.3f" % (tmp[0], tmp[1])