You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将NumPy数组随机分割为n个不等大小的子数组?

将NumPy数组分割为n个随机大小的子数组

这里有个简单高效的方法,不用手动拟合分布:

基础随机分割(允许子数组大小重复)

核心思路是生成n-1个随机分割点,直接用np.split完成分割:

import numpy as np

x = np.arange(1, 100, 1)
n = 10

# 生成n-1个不重复的随机分割点(范围在1到len(x)-1之间)
split_points = np.sort(np.random.choice(len(x)-1, n-1, replace=False)) + 1
# 分割数组
result = np.split(x, split_points)

# 验证结果:打印每个子数组的长度
for i, part in enumerate(result):
    print(f"子数组{i+1}长度:{len(part)}")

解释:

  • np.random.choice(len(x)-1, n-1, replace=False):从0到len(x)-2中选n-1个不重复的数,加1后变成1到len(x)-1的分割索引
  • np.sort保证分割点按升序排列,避免分割出错
  • np.split会根据分割点把原数组拆成n个连续的子数组

严格不等大小的分割

如果需要每个子数组的大小都不一样,可以加个循环校验:

import numpy as np

x = np.arange(1, 100, 1)
n = 10

while True:
    split_points = np.sort(np.random.choice(len(x)-1, n-1, replace=False)) + 1
    # 计算每个子数组的长度
    sizes = np.diff(np.concatenate([[0], split_points, [len(x)]]))
    # 检查所有长度是否唯一
    if len(np.unique(sizes)) == n:
        break

result = np.split(x, split_points)

# 验证结果
for i, part in enumerate(result):
    print(f"子数组{i+1}长度:{len(part)}")

这个方法通过循环生成分割点,直到所有子数组长度都不重复为止,逻辑简单易理解,比手动拟合伯努利分布高效得多。

内容的提问来源于stack exchange,提问作者Vladislav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:37:06