np.argpartition/np.argsort.
-
(10000,365), argsort . , replace=False, np.random.choice.
50 .
, .
np.argpartition k=50.
, , :
np.sort(np.random.rand(10000,365).argpartition(50,axis=1)[:,:50])
In [209]: out = np.sort(np.random.rand(10000,365).argpartition(50,axis=1)[:,:50])
In [210]: count = np.bincount(out.ravel(), minlength=365)
In [211]: print count.min(), count.max()
1277 1466
! , .
-
def org_app():
return np.array([np.sort(np.random.choice(365, 50, replace=False)) for _ in range(10000)])
def sort_random_choice():
return np.sort([np.random.choice(365, 50, replace=False) for _ in range(10000)], axis=1)
def random_permute():
l = np.array([True]*50 + [False]*315)
total = np.arange(1,366)
return np.array([total[np.random.permutation(l)] for _ in range(10000)])
def argpartition_sort(nrows=10000, maxc=365, ncols=50):
return np.sort(np.random.rand(nrows,maxc).argpartition(ncols,axis=1)[:,:ncols])
def while_loop():
arr = np.random.choice(365, 10000)
for i in range(49):
arr2 = np.random.choice(365, 10000)
comp = (arr2 == arr)
while comp.any():
duplicate = comp if i==0 else comp.any(axis=0)
arr2[duplicate] = np.random.choice(365, duplicate.sum())
comp = (arr2 == arr)
arr = np.vstack([arr, arr2])
arr = arr.T
arr.sort(axis=1)
return arr
-
In [44]: %timeit org_app()
...: %timeit sort_random_choice()
...: %timeit random_permute()
...: %timeit argpartition_sort()
...: %timeit while_loop()
...:
1 loops, best of 3: 258 ms per loop
1 loops, best of 3: 232 ms per loop
10 loops, best of 3: 166 ms per loop
10 loops, best of 3: 79.9 ms per loop
10 loops, best of 3: 58.6 ms per loop