创建具有随机整数的numpy数组,每行具有另一个范围 [英] Create numpy array with random integers each row with another range
本文介绍了创建具有随机整数的numpy数组,每行具有另一个范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要制作一个快速的numpy数组,该数组会在每一行中生成具有不同范围的随机整数.
i need to make fast numpy array that generates random integers in each row with a different range.
我可以使用的代码,但是当我将向量数增加到300000时,代码却很慢:
Code that works by my but is slow when i increase vectors number to 300000:
import numpy as np
import random
population_size = 4
vectors_number = population_size * 3
add_matrix = []
for i in range(0, int(vectors_number/population_size)):
candidates = list(range(population_size*i, population_size*(i+1)))
random_index = random.sample(candidates, 4)
add_matrix.append(random_index)
winning_matrix = np.row_stack(add_matrix)
print(winning_matrix)
每行从可变范围中选择4个随机数.
Each row is choose 4 random numbers from variable range.
输出:
[[ 3 0 1 2]
[ 4 6 7 5]
[11 9 8 10]]
最好仅使用不带循环的numpy来创建该矩阵
Best would by create that matrix using only numpy without loops
推荐答案
以下是 this trick
之后的矢量化方法提取唯一的随机样本-
Here's a vectorized approach following this trick
to extract unique random samples -
ncols = 4
N = int(vectors_number/population_size)
offset = np.arange(N)[:,None]*population_size
winning_matrix = np.random.rand(N,population_size).argsort(1)[:,:ncols] + offset
我们还可以利用np.argpartition
代替最后一步-
We can also leverage np.argpartition
to replace the last step -
r = np.random.rand(N,population_size)
out = r.argpartition(ncols,axis=1)[:,:ncols] + offset
时间-
In [63]: import numpy as np
...: import random
...:
...: population_size = 64
...: vectors_number = population_size * 300000
In [64]: %%timeit
...: add_matrix = []
...: for i in range(0, int(vectors_number/population_size)):
...: candidates = list(range(population_size*i, population_size*(i+1)))
...: random_index = random.sample(candidates, 4)
...: add_matrix.append(random_index)
...:
...: winning_matrix = np.row_stack(add_matrix)
1 loop, best of 3: 1.82 s per loop
In [65]: %%timeit
...: ncols = 4
...: N = int(vectors_number/population_size)
...: offset = np.arange(N)[:,None]*population_size
...: out = np.random.rand(N,population_size).argsort(1)[:,:ncols] + offset
1 loop, best of 3: 718 ms per loop
In [66]: %%timeit
...: ncols = 4
...: N = int(vectors_number/population_size)
...: offset = np.arange(N)[:,None]*population_size
...: r = np.random.rand(N,population_size)
...: out = r.argpartition(ncols,axis=1)[:,:ncols] + offset
1 loop, best of 3: 428 ms per loop
这篇关于创建具有随机整数的numpy数组,每行具有另一个范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文