反转numpy数组中随机选择的键

时间:2014-04-09 11:27:21

标签: python arrays numpy

我有一个名为arr的巨大的np.array,带有N个值,并随机选择这些值的10%:

choice=random.sample(range(N), int(N*percent))  # percent has values 0-1
newarr=arr[choice]

N可能超过200万个值。

实际上我还需要一个包含其他90%值的数组。所以目前我使用的是非常慢的以下内容:

def buildRevChoice(choice, nevents):
        revChoice=[]
        for i in range(N):
            if not i in choice:
                revChoice.append(i)
        return revChoice

你能想出一种方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:6)

您可以random.shuffle列表,然后根据需要将其拆分。

def choice(N, percent):
    tmp = range(N)
    random.shuffle(tmp)
    cut = int(N * percent)
    return tmp[:cut], tmp[cut:]

你将获得两个列表,第一个包含所选列表,第二个包含其余列表。

答案 1 :(得分:2)

如果您对掩码数组的内存开销没有问题,这似乎比通过索引选择其他值更快,并保留are中元素的顺序。以下是我从IPython笔记本中获得的时间:

N = 2000000
arr = random.random(N)
percent = 0.10

我的解决方案:

%% timeit
choice = random.choice(N, N*percent)
mask = zeros_like(arr, bool)   
mask[choice] = True
newarr = arr[mask]
revchoice = arr[~mask]

10个循环,最佳3:每循环18.1 ms

0605002的解决方案:

tmp = range(N)
random.shuffle(tmp)
cut = int(N * percent)
newarr, revchoice = tmp[:cut], tmp[cut:]

1个循环,最好为每个循环3:603 ms