@@ -18,15 +18,6 @@ ctypedef uint32_t (* random_uint_1_i_32)(aug_state* state, uint32_t a) nogil
1818ctypedef int32_t (* random_int_2_i_32)(aug_state* state, int32_t a, int32_t b) nogil
1919ctypedef int64_t (* random_int_2_i)(aug_state* state, int64_t a, int64_t b) nogil
2020
21- cdef np.npy_intp compute_numel(size):
22- cdef np.npy_intp i, n = 1
23- if isinstance (size, tuple ):
24- for i in range (len (size)):
25- n *= size[i]
26- else :
27- n = size
28- return n
29-
3021cdef check_output(object out, object dtype, object size):
3122 if out is None :
3223 return
@@ -137,7 +128,7 @@ cdef object cont_broadcast_1(aug_state* state, void* func, object size, object l
137128
138129 randoms_data = < double * > np.PyArray_DATA(randoms)
139130 n = np.PyArray_SIZE(randoms)
140- it = np.broadcast (randoms, a_arr)
131+ it = np.PyArray_MultiIterNew2 (randoms, a_arr)
141132
142133 with lock, nogil:
143134 for i in range (n):
@@ -290,11 +281,10 @@ cdef object cont(aug_state* state, void* func, object size, object lock, int nar
290281 cdef np.npy_intp i, n
291282 cdef np.ndarray randoms
292283 if out is None :
293- n = compute_numel(size)
294- randoms = np.empty(n, np.double)
284+ randoms = < np.ndarray> np.empty(size)
295285 else :
296286 randoms = < np.ndarray> out
297- n = np.PyArray_SIZE(randoms)
287+ n = np.PyArray_SIZE(randoms)
298288
299289 cdef double * randoms_data = < double * > np.PyArray_DATA(randoms)
300290 cdef random_double_0 f0;
@@ -321,7 +311,7 @@ cdef object cont(aug_state* state, void* func, object size, object lock, int nar
321311 randoms_data[i] = f3(state, _a, _b, _c)
322312
323313 if out is None :
324- return np.asarray( randoms).reshape(size)
314+ return randoms
325315 else :
326316 return out
327317
@@ -346,7 +336,7 @@ cdef object discrete_broadcast_d(aug_state* state, void* func, object size, obje
346336 randoms_data = < long * > np.PyArray_DATA(randoms)
347337 n = np.PyArray_SIZE(randoms)
348338
349- it = np.broadcast (randoms, a_arr)
339+ it = np.PyArray_MultiIterNew2 (randoms, a_arr)
350340 with lock, nogil:
351341 for i in range (n):
352342 a_val = (< double * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
@@ -486,7 +476,7 @@ cdef object discrete_broadcast_i(aug_state* state, void* func, object size, obje
486476 randoms_data = < long * > np.PyArray_DATA(randoms)
487477 n = np.PyArray_SIZE(randoms)
488478
489- it = np.broadcast (randoms, a_arr)
479+ it = np.PyArray_MultiIterNew2 (randoms, a_arr)
490480 with lock, nogil:
491481 for i in range (n):
492482 a_val = (< long * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
@@ -591,44 +581,48 @@ cdef object disc(aug_state* state, void* func, object size, object lock,
591581 else :
592582 return (< random_uint_iii> func)(state, _ia, _ib, _ic)
593583
594- cdef np.npy_intp i, n = compute_numel(size)
595- cdef np.int_t [::1 ] randoms = np.empty(n, np.int)
584+ cdef np.npy_intp i, n
585+ cdef np.ndarray randoms = < np.ndarray> np.empty(size, np.int)
586+ cdef np.int_t * randoms_data
596587 cdef random_uint_0 f0;
597588 cdef random_uint_d fd;
598589 cdef random_uint_dd fdd;
599590 cdef random_uint_di fdi;
600591 cdef random_uint_i fi;
601592 cdef random_uint_iii fiii;
602593
594+ n = np.PyArray_SIZE(randoms)
595+ randoms_data = < np.int_t * > np.PyArray_DATA(randoms)
596+
603597 with lock, nogil:
604598 if narg_long == 0 :
605599 if narg_double == 0 :
606600 f0 = (< random_uint_0> func)
607601 for i in range (n):
608- randoms [i] = f0(state)
602+ randoms_data [i] = f0(state)
609603 elif narg_double == 1 :
610604 fd = (< random_uint_d> func)
611605 for i in range (n):
612- randoms [i] = fd(state, _da)
606+ randoms_data [i] = fd(state, _da)
613607 elif narg_double == 2 :
614608 fdd = (< random_uint_dd> func)
615609 for i in range (n):
616- randoms [i] = fdd(state, _da, _db)
610+ randoms_data [i] = fdd(state, _da, _db)
617611 elif narg_long == 1 :
618612 if narg_double == 0 :
619613 fi = (< random_uint_i> func)
620614 for i in range (n):
621- randoms [i] = fi(state, _ia)
615+ randoms_data [i] = fi(state, _ia)
622616 if narg_double == 1 :
623617 fdi = (< random_uint_di> func)
624618 for i in range (n):
625- randoms [i] = fdi(state, _da, _ib)
619+ randoms_data [i] = fdi(state, _da, _ib)
626620 else :
627621 fiii = (< random_uint_iii> func)
628622 for i in range (n):
629- randoms [i] = fiii(state, _ia, _ib, _ic)
623+ randoms_data [i] = fiii(state, _ia, _ib, _ic)
630624
631- return np.asarray( randoms).reshape(size)
625+ return randoms
632626
633627
634628cdef object cont_broadcast_float_1(aug_state* state, void * func, object size, object lock,
@@ -656,7 +650,7 @@ cdef object cont_broadcast_float_1(aug_state* state, void* func, object size, ob
656650
657651 randoms_data = < float * > np.PyArray_DATA(randoms)
658652 n = np.PyArray_SIZE(randoms)
659- it = np.broadcast (randoms, a_arr)
653+ it = np.PyArray_MultiIterNew2 (randoms, a_arr)
660654
661655 with lock, nogil:
662656 for i in range (n):
@@ -694,11 +688,10 @@ cdef object cont_float(aug_state* state, void* func, object size, object lock,
694688 cdef np.npy_intp i, n
695689 cdef np.ndarray randoms
696690 if out is None :
697- n = compute_numel(size)
698- randoms = np.empty(n, np.float32)
691+ randoms = < np.ndarray> np.empty(size, np.float32)
699692 else :
700693 randoms = < np.ndarray> out
701- n = np.PyArray_SIZE(randoms)
694+ n = np.PyArray_SIZE(randoms)
702695
703696 cdef float * randoms_data = < float * > np.PyArray_DATA(randoms)
704697 cdef random_float_1 f1 = < random_float_1> func;
@@ -708,6 +701,6 @@ cdef object cont_float(aug_state* state, void* func, object size, object lock,
708701 randoms_data[i] = f1(state, _a)
709702
710703 if out is None :
711- return np.asarray( randoms).reshape(size)
704+ return randoms
712705 else :
713706 return out
0 commit comments