我将上面的@tobias\u k方法扩展到
k
价值观
def uni_repl(n, k, s = 1000):
x = np.empty((k, s), dtype = int)
for i in range(k):
x[i] = np.random.randint(low = 0, high = n - k + i + 1, size = s)
for i in range(1, k):
x[:i][x[:i] == x[i]] = n - k + i
return x
测试:
test = np.zeros((5,5,5))
np.add.at(test, list(uni_repl(5, 3)), 1)
test
Out[85]:
array([[[ 0., 0., 0., 0., 0.],
[ 0., 0., 16304., 16767., 16622.],
[ 0., 16418., 0., 16631., 16517.],
[ 0., 16688., 16607., 0., 16495.],
[ 0., 16663., 16544., 16877., 0.]],
[[ 0., 0., 16736., 16767., 16668.],
[ 0., 0., 0., 0., 0.],
[ 16862., 0., 0., 16634., 16632.],
[ 16791., 0., 16689., 0., 16557.],
[ 16566., 0., 16843., 16864., 0.]],
[[ 0., 16737., 0., 16638., 16437.],
[ 16741., 0., 0., 16545., 16617.],
[ 0., 0., 0., 0., 0.],
[ 16804., 16923., 0., 0., 16598.],
[ 16756., 16850., 0., 16778., 0.]],
[[ 0., 16777., 16675., 0., 16760.],
[ 16454., 0., 16792., 0., 16669.],
[ 16476., 16709., 0., 0., 16677.],
[ 0., 0., 0., 0., 0.],
[ 16680., 16863., 16640., 0., 0.]],
[[ 0., 16459., 16446., 16756., 0.],
[ 16637., 0., 16626., 16756., 0.],
[ 16481., 16773., 0., 16762., 0.],
[ 16754., 16531., 16681., 0., 0.],
[ 0., 0., 0., 0., 0.]]])
与使用
np.argpartition
,这似乎更快,只要
k < 0.4 * n
def uni_part(n, k, s = 1000):
x = np.random.rand(n, s)
return np.argpartition(x, k, axis = 0)[:k]
%timeit uni_part(100, 40)
100 loops, best of 3: 3.93 ms per loop
%timeit uni_repl(100, 40)
100 loops, best of 3: 3.76 ms per loop
%timeit uni_part(100, 10)
100 loops, best of 3: 3.55 ms per loop
%timeit uni_repl(100, 10)
1000 loops, best of 3: 425 µs per loop
%timeit uni_part(100, 50)
100 loops, best of 3: 4.08 ms per loop
%timeit uni_repl(100, 50)
100 loops, best of 3: 4.89 ms per loop