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

use*_*736 5 python arrays numpy

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

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

N可能超过200万个值.

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

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

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

060*_*002 7

您可以只random.shuffle列出该列表,然后根据需要进行拆分.

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

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

  • 不是一个坏的解决方案 虽然我对random.shuffle的性能有些警惕.潜在的随机免疫能力更强.并且取决于如何实现,np.argsort(random.randint())可能是生成置换索引的更快的方法. (2认同)