! , , , a = np.arange(5), ..
a = np.array([0,1,2,3,4])
, , 5 a. , :
reps = np.array([2,4,6,2,2])
:
In [32]: rep_nums = np.repeat(a,reps)
In [33]: rep_nums
Out[33]: array([0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4])
, z np.random.choice() .
z = 7, 7, np.random.choice() :
In [34]: np.random.choice(rep_nums,7,replace=False)
Out[34]: array([2, 4, 0, 2, 4, 1, 2])
without replacement , rep_nums. , , , np.random.choice() , . 4's, rep_nums 4's.
, , np.repeat, .
rep_nums, z = 7 , rep_nums:
In [44]: np.random.choice(rep_nums.size,7,replace=False)
Out[44]: array([ 7, 2, 4, 10, 13, 8, 3])
. , bin ( 5 ) rep_nums, 7. np.searchsorted. , x, y, :
intervals = data.astype(int).cumsum()
max_num = intervals[-1]
ids = np.random.choice(max_num,z,replace=False)
out = x+np.searchsorted(intervals,ids,'right')
:
def org_app(x,y,z,data):
rep_nums = np.repeat(range(x,y), data.astype('int64'))
out = np.random.choice(rep_nums, z,replace=False)
return out
def optimized_v1(x,y,z,data):
intervals = data.astype(int).cumsum()
max_num = intervals[-1]
ids = np.random.choice(max_num,z,replace=False)
out = x+np.searchsorted(intervals,ids,'right')
return out
-
In [79]:
...: x = 100
...: y = 10010
...: z = 1000
...: data = np.random.randint(100,5000,(y-x)).astype(float)
...:
In [80]: %timeit org_app(x,y,z,data)
1 loop, best of 3: 7.17 s per loop
In [81]: %timeit optimized_v1(x,y,z,data)
1 loop, best of 3: 6.92 s per loop
, . , np.repeat!
-
In [82]: %timeit np.repeat(range(x,y), data.astype('int64'))
1 loop, best of 3: 227 ms per loop
, . , , np.random.choice(), -
In [83]: intervals = data.astype(int).cumsum()
...: max_num = intervals[-1]
...: ids = np.random.choice(max_num,z,replace=False)
...: out = x+np.searchsorted(intervals,ids,'right')
...:
In [84]: %timeit data.astype(int).cumsum()
10000 loops, best of 3: 36.6 ยตs per loop
In [85]: %timeit intervals[-1]
10000000 loops, best of 3: 142 ns per loop
In [86]: %timeit x+np.searchsorted(intervals,ids,'right')
10000 loops, best of 3: 127 ยตs per loop
, 227ms np.repeat!!
, , np.repeat , np.random.choice() .