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

Python中按梯度分布调整数组采样至目标长度(Downsizing/Upsampling)

固定长度梯度自适应x数组生成方案

你的核心需求是生成**固定长度(比如300个值)**的x数组,要求梯度越高的区域点间距越小,同时所有间距总和为1(对应x从0到1)。原代码通过动态拆分区间的方式导致长度不可控,这里改用分位数采样的方法解决问题,既保留梯度相关的分布特性,又严格控制数组长度。

实现步骤

  1. 先计算Beta分布PDF的梯度绝对值,确定哪些区域需要更密集的采样(梯度越高,点要越密)
  2. 把梯度转换为采样密度权重,再生成累积分布函数(CDF)
  3. 在[0,1]上取目标数量的均匀分位点,通过CDF的逆映射得到最终的x数组,自动满足长度要求和间距分布

完整可运行代码

import numpy as np
import scipy.stats as stats
from scipy.interpolate import interp1d

# 可配置参数
target_length = 300  # 你需要的固定数组长度
a = 0
b = 1
init_sample_num = 100  # 计算梯度用的初始采样点数,无需修改
alpha = 2
beta1 = 1.5
prozent = 10

# 1. 计算Beta PDF和对应的梯度
x_init = np.linspace(a, b, init_sample_num)
pdf_vals = stats.beta.pdf(x_init, alpha, beta1)
step = (b - a) / (init_sample_num - 1)
gradients = np.diff(pdf_vals) / step
grad_abs = np.abs(gradients)

# 2. 生成采样密度权重:梯度越高,权重越大(点越密)
c_delta = (prozent / 100) * np.trapz(grad_abs, dx=step)
density_weights = grad_abs + c_delta
# 归一化权重,保证总长度对应1
density_weights /= np.trapz(density_weights, dx=step)

# 3. 构建累积分布函数(CDF),用于后续采样
x_mid = x_init[:-1] + step/2  # 梯度对应的区间中点
cdf = np.cumsum(density_weights * step)
cdf = np.concatenate([[0], cdf])  # 补全起始点的CDF值0
x_full = np.concatenate([[x_init[0]], x_mid, [x_init[-1]]])

# 4. 生成固定长度的x数组:均匀分位数采样
quantiles = np.linspace(0, 1, target_length)
# 插值得到CDF的逆函数,把分位数转成x值
inv_cdf = interp1d(cdf, x_full, kind='linear')
fixed_x_array = inv_cdf(quantiles)

# 验证结果
print(f"生成数组长度:{len(fixed_x_array)}")
print(f"间距总和(应接近1):{np.sum(np.diff(fixed_x_array)):.6f}")

方案优势

  • 不再像原代码那样动态拆分区间,直接通过分位数采样强制固定长度
  • 梯度高的区域CDF增长更快,对应分位数映射后的点间距自然更小,完全保留你需要的梯度关联特性
  • 最终数组的间距总和严格为1,符合Beta PDF的输入要求
  • 代码逻辑简洁,参数调整直观,新手易上手

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:23:11