创建具有随机整数的numpy数组,每行具有另一个范围 [英] Create numpy array with random integers each row with another range

查看:67
本文介绍了创建具有随机整数的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆