Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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中成对列表的随机样本 我有两个列表,x和y,长度n,和席和彝形成一对。如何从这两个列表中随机抽取m个值的样本,同时保留配对信息(例如,结果样本中x[10]和y[10]将在一起)_Python_Random Sample - Fatal编程技术网

Python中成对列表的随机样本 我有两个列表,x和y,长度n,和席和彝形成一对。如何从这两个列表中随机抽取m个值的样本,同时保留配对信息(例如,结果样本中x[10]和y[10]将在一起)

Python中成对列表的随机样本 我有两个列表,x和y,长度n,和席和彝形成一对。如何从这两个列表中随机抽取m个值的样本,同时保留配对信息(例如,结果样本中x[10]和y[10]将在一起),python,random-sample,Python,Random Sample,我最初的想法是这样的 使用zip创建元组列表 洗牌元组列表 从列表中选择前m个元组 将元组分解为新的成对列表 代码应该是这样的 templist = list() for tup in zip(x, y): templist.append(tup) random.shuffle(templist) x_sub = [a for a, b in templist[0:m]] y_sub = [b for a, b in templist[0:m]] 这对我来说似乎有点笨拙。有没有什么

我最初的想法是这样的

  • 使用zip创建元组列表
  • 洗牌元组列表
  • 从列表中选择前m个元组
  • 将元组分解为新的成对列表
代码应该是这样的

templist = list()
for tup in zip(x, y):
    templist.append(tup)
random.shuffle(templist)
x_sub = [a for a, b in templist[0:m]]
y_sub = [b for a, b in templist[0:m]]

这对我来说似乎有点笨拙。有没有什么方法可以让它更清晰、简洁或更具python风格?

如果您有两个列表,其中的元素是彼此的直接对,并且只是
zip
它们(在python 3中,将该对象转换为
列表
),然后使用
random.sample
进行采样

>>> m = 4
>>> x = list(range(0, 3000, 3))
>>> y = list(range(0, 2000, 2))
>>> random.sample(list(zip(x, y)), m)
[(2145, 1430), (2961, 1974), (9, 6), (1767, 1178)]

如果有两个相同维度的列表,则只需对这些元素的子集进行采样并将结果配对即可

x = [1,2,3,4,5] 
y = [6,7,8,9,10]
sample_size = 3
idx = np.random.choice(len(x), size=sample_size, replace=False)
pairs = [(x[n], y[n]) for n in idx]
>>> pairs
[(5, 10), (2, 7), (1, 6)]

也许你的意思是采样m个元素

x_sub, y_sub = zip(*random.sample(list(zip(x, y)), m))

您可以实现
random\u产品
itertools配方。我将使用第三方库,它为我们实现了这个配方。通过
pip安装更多\u itertools
安装此库

代码

import more_itertool as mit


x, y, m = "abcdefgh", range(10), 2

iterable = mit.random_product(x, y, repeat=m) 
结果

iterable
# ('e', 9, 'f', 3)
目前尚不清楚OP想要结果的形式,但您可以将
x
y
组合在一起,例如
[(x[0],y[0]),(x[1],y[1]),…]

paired_xy = list(zip(*[iter(iterable)]*2))
paired_xy
# [('e', 9), ('f', 3)]
paired_xx = list(zip(*paired_xy))
paired_xx
# [('e', 'f'), (9, 3)]
有关对连续项目进行分组的信息,请参见和

或者,您可以
zip
进一步分组
x
y
,例如
[(x[0],x[1],…),(y[0],y[1],…)]

注意,这种方法可以接受任意数量的iterables,
x
y
z
,等等

# Select m random items from multiples iterables, REF 101
x, y, m = "abcdefgh", range(10), 2
a, b, c = "ABCDE", range(10, 100, 10), [False, True]
iterable = mit.random_product(x, y, a, b, c, repeat=m) 
iterable
# ('d', 6, 'E', 80, True, 'a', 1, 'D', 50, False)

详细信息

iterable
# ('e', 9, 'f', 3)
从:

我们可以看到函数确实接受多个参数,每个参数都成为池的集合。池的大小根据
repeat
关键字的值进行缩放。从每个池中进行随机选择,并将其组合在一起作为最终结果


有关更多工具,请参见。

您是否已将@metatoaster作为shuffle命令的替代品?整个解决方案仍然有点含糊不清。除非
random.sample
可以将两个成对的列表作为输入。我喜欢这个解决方案创建两个新列表,而不是一个元组列表。在其他方面有点密集,但简洁和清晰似乎总是不一致的!我试图执行此操作时出错(假设m=3)@Alexander
m
是样本大小,OP没有提供它,只是变量
m
,什么错误-对我来说很好。@Alexander使用以下输入对两个列表中的m元素进行采样,我得到以下错误(Python 2.7.10):x=[1,2,3,4,5]y=[6,7,8,9,10]m=3 TypeError:random_sample()最多使用1个位置参数(给定2个),当我运行代码时,它显示“SyntaxError:closing括号”)'与开始括号“[”不匹配。我尝试过调整它,但没有成功。请看一看,好吗?@MarkK更正了上面的内容。太棒了!感谢您的后续操作!