如何计算[-1,1]×[-1,1]上多元均匀分布的点密度并优化实现
针对2维固定域的极速实现
如果你的使用场景固定为[-1, 1] × [-1, 1]的均匀分布,直接用简化逻辑即可,注意你之前的临时实现存在笔误,边界判断应该是np.abs(x) <=1而非<=2:
def uniform_2d_square(x): return 0.25 if np.abs(x).max() <= 1 else 0.0
这个实现比np.all的版本性能略高,单样本场景下运算步骤更少。
通用多维均匀分布的优化实现
你写的通用版本逻辑正确,可针对高频调用和批量输入做两点优化:
- 提前计算归一化常数,避免每次调用重复计算区间长度乘积
- 支持批量输入多个点,无需循环调用
class MultivariateUniform: def __init__(self, lows, highs): self.lows = np.asarray(lows) self.highs = np.asarray(highs) self.norm = 1.0 / np.prod(self.highs - self.lows) def pdf(self, x): x = np.asarray(x) in_bound = np.all((x >= self.lows) & (x <= self.highs), axis=-1) return in_bound * self.norm
使用示例:
# 初始化分布 dist = MultivariateUniform(lows=[-1, -1], highs=[1, 1]) # 单样本计算 print(dist.pdf([0, 0])) # 输出 0.25 # 批量计算多个点的PDF print(dist.pdf([[0,0], [2,0], [-0.5, 0.5]])) # 输出 [0.25, 0. , 0.25]
最规范的官方方案
scipy 1.7及以上版本提供了原生的多维均匀分布实现,经过官方性能优化,是最推荐的方案,完美解决你之前调用单变量uniform返回向量的问题:
import numpy as np from scipy.stats import multivariate_uniform # loc为各维度最小值,scale为各维度区间长度 dist = multivariate_uniform(loc=[-1, -1], scale=[2, 2]) x = np.zeros(2) print(dist.pdf(x)) # 直接输出标量 0.25
如果使用的是旧版本scipy,用上面自定义的类即可满足需求。
内容的提问来源于stack exchange,提问作者Euler_Salter
相关产品推荐
相关产品推荐

