Python 如何从多个长度相等的数组中删除相同的随机项?
我有几个大小为(20000,1)的数组,其中包含不同的内容。我希望每个数组随机删除25%的所有行,这样每个数组都会删除相同的行。 我发现一个相当乏味的方法是: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
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)
是每个数组中的行数(我想你说的是20000行)total_rows
是要保留的行的百分比,根据您的说法,它是keep\u ratio
1-0.25=0.75
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]
谢谢,这正是我想要的。