我有一个名为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
你能想出一种方法来解决这个问题吗?
答案 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