大块重复随机选择

时间:2020-09-27 20:36:06

标签: python numpy random numba

想象一个2D布尔字段。假设它是一个a x b = 3x3的字段

F= [[0 1 0] [0 1 0] [1 1 1]]

without_zeros(range(9)*F) = (1 4 6 7 8 ) 这是F = True的惯用语列表。

现在我需要N =例如1M种可能性,以便在该数字范围内随机选择m个(例如3个)选择,而无需重复

例如

1 7 4
4 6 8
8 6 1
1 6 4
... 

我使用向量化函数的方法失败。

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

我的问题:是否有更好的方法可以防止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")

0 个答案:

没有答案