如何将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
相关产品推荐
相关产品推荐

