Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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 如何从多个长度相等的数组中删除相同的随机项?_Python_Arrays_Numpy_Python 2.7 - Fatal编程技术网

Python 如何从多个长度相等的数组中删除相同的随机项?

Python 如何从多个长度相等的数组中删除相同的随机项?,python,arrays,numpy,python-2.7,Python,Arrays,Numpy,Python 2.7,我有几个大小为(20000,1)的数组,其中包含不同的内容。我希望每个数组随机删除25%的所有行,这样每个数组都会删除相同的行。 我发现一个相当乏味的方法是: import numpy as np a=np.array(range(1000)) b=np.array(np.random.rand(1000)) seed=np.random.randint(0,100000000) #picking a random seed np.random.seed(seed) #Set

我有几个大小为(20000,1)的数组,其中包含不同的内容。我希望每个数组随机删除25%的所有行,这样每个数组都会删除相同的行。 我发现一个相当乏味的方法是:

import numpy as np

a=np.array(range(1000))
b=np.array(np.random.rand(1000))
seed=np.random.randint(0,100000000)     #picking a random seed
np.random.seed(seed)      #Setting the same seed for each deletion
a[np.random.rand(*a.shape) < .25] = 0
np.random.seed(seed)
b[np.random.rand(*b.shape) < .25] = 0
a=a[a !=0]
b=b[b !=0]
将numpy导入为np
a=np.阵列(范围(1000))
b=np.数组(np.rand.rand(1000))
seed=np.random.randint(0100000000)#选择一个随机种子
np.random.seed(seed)#为每次删除设置相同的种子
a[np.random.rand(*a.shape)<.25]=0
np.随机种子(种子)
b[np.rand.rand(*b.shape)<.25]=0
a=a[a!=0]
b=b[b!=0]
这种方法有几个问题,例如如果数组已经包含零怎么办?
有更好的方法吗?

这里有一个非常笼统的非numpy解决方案:

import random
to_keep = set(random.sample(range(total_rows), keep_ratio * total_rows))

#do this for each array:
new_array = np.array(item for index, item in enumerate(old_array) if index in to_keep)
  • total_rows
    是每个数组中的行数(我想你说的是20000行)

  • keep\u ratio
    是要保留的行的百分比,根据您的说法,它是
    1-0.25=0.75

编辑

您还可以使用numpy的
compress()
方法

import random
to_keep = set(random.sample(range(total_rows), keep_ratio * total_rows))
kompressor = (1 if i in to_keep else 0 for i in xrange(total_rows))

new_array = numpy.compress(kompressor, old_array, axis=1)
kompressor

基于Joel Cornett的解决方案并对其进行扩展:

import numpy as np

length = 20000
limit = int(0.75*length)
keep = np.random.permutation(length)[:limit]

newArray = oldArray[keep]

我不知道这在
numpy
中的效果如何,但这是我在纯Python中使用的:

total = len(a)
toss = int(0.25 * total)
keeping = [False] * toss + [True] * (total - toss)
random.shuffle(keeping)
a = [value for value, flag in zip(a, keeping) if flag]
b = [value for value, flag in zip(b, keeping) if flag]

与Theodros的答案类似,但保留了元素的原始顺序:

import numpy as np

mask = np.ones(len(a), dtype=bool)
mask[:len(a)/4] = 0
np.random.shuffle(mask)

a = a[mask]
b = b[mask]

谢谢,这正是我想要的。