Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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 numpy采集许多样本,不按行替换_Python_Python 2.7_Numpy - Fatal编程技术网

Python numpy采集许多样本,不按行替换

Python numpy采集许多样本,不按行替换,python,python-2.7,numpy,Python,Python 2.7,Numpy,我有一个很大的清单。想象一下它看起来像这样: test = ['llama', 'cow', 'horse', 'fish', 'sheep', 'goat', 'cat', 'dog'] 我想多次从这个列表中抽取样本。我希望每个样品都不需要更换。在这种情况下,我希望避免for循环 我在StackOverflow上看到了很多非常接近的解决方案,但这并不完全是我需要的。假设我想要的每个样品都是3号的。如果我想用替换品取样,这将起作用: np.random.choice(test, size=(1

我有一个很大的清单。想象一下它看起来像这样:

test = ['llama', 'cow', 'horse', 'fish', 'sheep', 'goat', 'cat', 'dog']
我想多次从这个列表中抽取样本。我希望每个样品都不需要更换。在这种情况下,我希望避免for循环

我在StackOverflow上看到了很多非常接近的解决方案,但这并不完全是我需要的。假设我想要的每个样品都是3号的。如果我想用替换品取样,这将起作用:

np.random.choice(test, size=(100, 3))
这将给我100行,每行3个样本。问题是任何特定的行都可能有重复,我不能要求它在不替换的情况下进行采样,因为300>lentest

有没有办法保持随机性?我看到了使用np.argsort的潜在解决方案,但考虑到正在进行排序,我不确定它们是否仍然是随机的

您可以对每行运行np.random.choice而不进行替换,并将结果放入矩阵中。这可以通过这个命令来完成

np.array([np.random.choice(test, 3, replace=False) for i in range(100)])
您可以对每一行运行np.random.choice而无需替换一次,并将结果放入矩阵中。这可以通过这个命令来完成

np.array([np.random.choice(test, 3, replace=False) for i in range(100)])
您可以使用random.sample,从:

返回从填充序列中选择的唯一元素的k长度列表。用于无需更换的随机抽样

并使用列表理解重复该过程n_次:

n_times = 100
n_sample = 3
[random.sample(test, n_sample) for i in range(n_times)]

[['llama', 'goat', 'sheep'],
 ['cat', 'horse', 'dog'],
 ['sheep', 'dog', 'goat'],
 ['cat', 'cow', 'llama'],
 ['dog', 'fish', 'horse'],
 ['llama', 'horse', 'cow'],
 ['dog', 'goat', 'cow'],
 ['llama', 'cow', 'sheep'],
 ['fish', 'dog', 'horse'],
 ... 
您可以使用random.sample,从:

返回从填充序列中选择的唯一元素的k长度列表。用于无需更换的随机抽样

并使用列表理解重复该过程n_次:

n_times = 100
n_sample = 3
[random.sample(test, n_sample) for i in range(n_times)]

[['llama', 'goat', 'sheep'],
 ['cat', 'horse', 'dog'],
 ['sheep', 'dog', 'goat'],
 ['cat', 'cow', 'llama'],
 ['dog', 'fish', 'horse'],
 ['llama', 'horse', 'cow'],
 ['dog', 'goat', 'cow'],
 ['llama', 'cow', 'sheep'],
 ['fish', 'dog', 'horse'],
 ... 

下面是一个使用rand+argsort/argpartition技巧的矢量化方法-

在一些帮助下,让我们验证每行的所有内容都是唯一的-

In [51]: idx = np.random.rand(100, len(test)).argpartition(3,axis=1)[:,:3]
    ...: out = np.take(test, idx)

In [52]: import pandas as pd

In [53]: (pd.DataFrame(out).nunique(axis=1).values==3).all()
Out[53]: True

下面是一个使用rand+argsort/argpartition技巧的矢量化方法-

在一些帮助下,让我们验证每行的所有内容都是唯一的-

In [51]: idx = np.random.rand(100, len(test)).argpartition(3,axis=1)[:,:3]
    ...: out = np.take(test, idx)

In [52]: import pandas as pd

In [53]: (pd.DataFrame(out).nunique(axis=1).values==3).all()
Out[53]: True

你不想把比原始列表短或长的两个样本封装在一个包含if/else语句的自定义函数中吗?我的意思是,这对我来说真的不是什么大问题;我不可能编辑它。最大的问题是,我想从同一个列表中提取许多样本,每个样本都需要无需更换。我使用过的其他语言在其函数中内置了此功能。我想看看我是否遗漏了什么。所以在你的例子中,你希望每一行都不替换,但你不在乎一行是否与另一行相同,对吗?没错,这就是我要找的。难道你不想在一个包含if/else语句的自定义函数中封装比原始列表短或长的两种可能性样本吗?我的意思是,这对我来说真的不是什么大问题;我不可能编辑它。最大的问题是,我想从同一个列表中提取许多样本,每个样本都需要无需更换。我使用过的其他语言在其函数中内置了此功能。我想看看我是否遗漏了什么。所以在你的例子中,你希望每一行都不替换,但你不在乎一行是否与另一行相同,对吗?确切地说,这就是我想要的。这基本上是我现在实现的。我唯一的问题是,对于我正在做的事情来说,它实际上太慢了。我想知道是否有一个实现,我错过了,这将做什么,我需要比这更快。我投了赞成票,但坚持其他答案。这基本上是我现在已经实现的。我唯一的问题是,对于我正在做的事情来说,它实际上太慢了。我想知道是否有一个实现,我错过了,这将做什么,我需要比这更快。向上投票,但坚持其他答案。这种方式采集的样本相互独立吗?我无意中发现了您对另一个线程的响应,但我并没有真正理解此方法的实际作用。@JohnRouhana是的,它们是独立的,因为argpartition3,axis=1沿每行独立运行。argsort或argpartition实现了每行唯一索引的目标,即每行没有替换。我观察到与我所拥有的相比有一个边际的加速,所以我接受这个答案。谢谢。这种方式采集的样本相互独立吗?我无意中发现了您对另一个线程的响应,但我并没有真正理解此方法的实际作用。@JohnRouhana是的,它们是独立的,因为argpartition3,axis=1沿每行独立运行。argsort或argpartition实现了每行唯一索引的目标,即每行没有替换。我观察到与我所拥有的相比有一个边际的加速,所以我接受这个答案。谢谢