Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy重复随机选择_Python_Numpy_Random_Numba - Fatal编程技术网

Python Numpy重复随机选择

Python Numpy重复随机选择,python,numpy,random,numba,Python,Numpy,Random,Numba,想象一个二维布尔字段。假设它是一个a x b=3x3字段 F=[[0110][0110][1111]] 不带零(范围(9)*F)=(1 4 6 7 8) 这是ID列表,其中F=True 现在,我需要N=e.g.1M的可能性,从这个数字范围内随机选择m(例如3),而不重复 e、 g 我使用矢量化函数的方法失败了 到目前为止,我最好的成绩是 a=3,b=3,N=5E6,m=3 ~84秒。在i37250上 我的问题:有没有更好的方法防止for循环并并行/矢量化工作 compiled - start t

想象一个二维布尔字段。假设它是一个a x b=3x3字段

F=[[0110][0110][1111]]

不带零(范围(9)*F)=(1 4 6 7 8)
这是ID列表,其中F=True

现在,我需要N=e.g.1M的可能性,从这个数字范围内随机选择m(例如3),而不重复

e、 g

我使用矢量化函数的方法失败了

到目前为止,我最好的成绩是 a=3,b=3,N=5E6,m=3 ~84秒。在i37250上

我的问题:有没有更好的方法防止for循环并并行/矢量化工作

compiled - start timer
Time: 84.47356009483337
finish
工作示例:

import numpy as np
from numba import jit, prange
import time as t

@jit
def startzellen_zufall(mask, m, N):
    b = mask.reshape(mask.size)
    a = np.arange(1, len(b) + 1, dtype=np.int16)
    c = a * b
    clean = np.array(c[c != 0], dtype=np.int16)

    l = []
    for i in prange(0, N):
        l.append(np.random.choice(clean, m, replace=False))
    return np.stack(l)

##############
N = 5000000
m = 3
mask = np.array([[True, False, False], [False, True, True], [True, False, True]])

startzellen_zufall(mask, m, N)
print("compiled - start timer")
t1 = t.time()
startzellen_zufall(mask, m, N)
t2 = t.time()
print("Time: %s" % (t2 - t1))
print("finish")


编辑:是的,我知道有少于1M的排列,数字只是例子。a、 b更像8,8,m更像6-10。如果重要,则索引的顺序很重要,例如1,7,4!=1,4,7编辑:是的,我知道有少于1M的排列,数字只是例子。a、 b更像8,8,m更像6-10。如果重要,则索引的顺序很重要,例如1,7,4!=1,4,7
import numpy as np
from numba import jit, prange
import time as t

@jit
def startzellen_zufall(mask, m, N):
    b = mask.reshape(mask.size)
    a = np.arange(1, len(b) + 1, dtype=np.int16)
    c = a * b
    clean = np.array(c[c != 0], dtype=np.int16)

    l = []
    for i in prange(0, N):
        l.append(np.random.choice(clean, m, replace=False))
    return np.stack(l)

##############
N = 5000000
m = 3
mask = np.array([[True, False, False], [False, True, True], [True, False, True]])

startzellen_zufall(mask, m, N)
print("compiled - start timer")
t1 = t.time()
startzellen_zufall(mask, m, N)
t2 = t.time()
print("Time: %s" % (t2 - t1))
print("finish")