Python 将列表拆分为n个随机大小的块

Python 将列表拆分为n个随机大小的块,python,list,numpy,sublist,numpy-random,Python,List,Numpy,Sublist,Numpy Random,我试图将一个列表拆分为n个子列表,其中每个子列表的大小都是随机的(至少有一个条目;假设p>I)。我使用了numpy.split函数,它工作得很好,但不满足我的随机性条件。你可能会问随机性应该遵循哪个分布。我认为,这不重要。我检查了几篇与我的帖子不相等的帖子,因为它们试图用几乎相同大小的块进行拆分。如果重复,请告诉我。我的做法如下: import numpy as np P = 10 I = 5 mylist = range(1, P + 1) [list(x) for x in np.spli

我试图将一个列表拆分为n个子列表,其中每个子列表的大小都是随机的(至少有一个条目;假设
p>I
)。我使用了numpy.split函数,它工作得很好,但不满足我的随机性条件。你可能会问随机性应该遵循哪个分布。我认为,这不重要。我检查了几篇与我的帖子不相等的帖子,因为它们试图用几乎相同大小的块进行拆分。如果重复,请告诉我。我的做法如下:

import numpy as np

P = 10
I = 5
mylist = range(1, P + 1)
[list(x) for x in np.split(np.array(mylist), I)]
p
不能被
I
整除时,这种方法就会崩溃。此外,它创建大小相等的块,而不是概率大小的块。另一个限制:我不想使用包
random
,但我可以使用
numpy
。不要问我为什么;我希望我对此有一个合乎逻辑的回答

根据疯狂科学家提供的答案,这是我尝试的代码:

P = 10
I = 5

data = np.arange(P) + 1
indices = np.arange(1, P)
np.random.shuffle(indices)
indices = indices[:I - 1]
result = np.split(data, indices)
result
输出:

[array([1, 2]),
 array([3, 4, 5, 6]),
 array([], dtype=int32),
 array([4, 5, 6, 7, 8, 9]),
 array([10])]
这仍然是一条路要走。如果您传入一系列整数,
split
将它们视为切点。生成随机切点很容易。你可以这样做

P = 10
I = 5

data = np.arange(P) + 1
indices = np.random.randint(P, size=I - 1)
您需要
I-1
切点来获得
I
块。索引需要排序,重复项需要删除。这两样都适合你。通过这种方式,您可能会得到少于
I
的块:

result = np.split(data, indices)
如果您确实需要
I
数字,请选择“不重新采样”。可通过以下方式实现:


问题可以重构为从
{1,2,…,p-1}
中选择
I-1
随机分割点,可以使用查看

因此,可按如下方式实施:

import numpy as np

split_points = np.random.choice(P - 2, I - 1, replace=False) + 1
split_points.sort()
result = np.split(data, split_points)

如果你同意numpy,为什么你坚持把所有的东西都列成一个列表?你的意思是我应该同意数组吗?这看起来像一个;将P星分成I个容器,每个容器至少有一个元素。可能重复@Chris我尝试了Kevin提供的函数。但是,我看不到任何关系。您可以尝试
P=11
,看到np.split不起作用。此外,np.split不能确保每个子列表(或子数组)的len是随机的/相反的,它会创建相等的len子数组。如果我错了,请纠正我。我确实打错了。第二个参数应该是
索引
,而不是
I
。现在修好了。
split
的行为非常依赖于第二个参数。
np.choice
更适合于该任务,尽管
np.shuffle
也可以。@user8028576。我想你是对的。很高兴你终于成功了。我建议你花些时间阅读我在答案中的链接,并准确理解它的工作原理。我很高兴你添加了这个例子。
import numpy as np

split_points = np.random.choice(P - 2, I - 1, replace=False) + 1
split_points.sort()
result = np.split(data, split_points)