timer_comparison.py 15 KB

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