我正在尝试将一个列表分成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])]
答案 0 :(得分:2)
可以通过从I-1
中选择{1,2,...,P-1}
个随机分裂点来重构问题,可以使用stars and bars查看。
因此,它可以实现如下:
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)
答案 1 :(得分:1)
np.split
仍然是路要走。如果您传递整数序列,split
将把它们视为切点。生成随机切割点很容易。您可以做类似的事情
P = 10
I = 5
data = np.arange(P) + 1
indices = np.random.randint(P, size=I - 1)
您想要I - 1
切点来获取I
块。索引需要排序,重复项需要删除。 np.unique
为您做到。通过这种方式,您可能最终得到少于I
个块:
result = np.split(data, indices)
如果您绝对需要I
号,请选择而不重采样。例如,可以通过np.shuffle
来实现:
indices = np.arange(1, P)
np.random.shuffle(indices)
indices = indices[:I - 1]
indices.sort()