【问题标题】:Split a list into n randomly sized chunks将列表拆分为 n 个随机大小的块
【发布时间】:2019-09-12 23:29:59
【问题描述】:

我正在尝试将一个列表拆分为 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])]

【问题讨论】:

  • 如果你对 numpy 没问题,为什么还要坚持一切都是列表?
  • 你的意思是我应该对数组没问题?
  • 这看起来像Stars and bars problem;将 P 星分成 I 个 bin,每个 bin 至少有一个元素。
  • General bars and stars的可能重复
  • @Chris 我尝试了 Kevin 提供的功能。但是,我看不到任何关系。

标签: python list numpy sublist numpy-random


【解决方案1】:

问题可以重构为从{1,2,...,P-1}中选择I-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)

【讨论】:

  • 很高兴你添加了这个例子。
【解决方案2】:

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()

【讨论】:

  • 你可以试试P=11 看看np.split 不起作用。
  • 此外,np.split 并不能确保每个子列表(或子数组)的 len 是随机的/相反,它会创建同样的 len 子数组。如果我错了,请纠正我。
  • 我确实有一个错字。第二个参数应该是indices,而不是I。现在修好了。 split 的行为非常依赖于第二个参数。
  • np.choice 更适合该任务,尽管 np.shuffle 也可以工作。
  • @user8028576。我想你是正确的。很高兴你终于让它工作了。我建议您花一些时间阅读我在答案中添加的链接,并准确了解为什么它有效。
猜你喜欢
  • 2012-07-12
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多