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

极坐标直方图重心计算异常:0与2π角度取值问题求解

解决极坐标直方图重心计算的周期性问题

直接对极角做算术平均会忽略极坐标的周期性——0和2π本质是同一个方向,但数值上的差异会导致重心计算结果偏离真实主导方向。正确的做法是通过向量加权平均来计算重心:

  1. 将每个直方图bin的中心角度转换为笛卡尔坐标系的向量分量(cosθ、sinθ)
  2. 用bin的权重(归一化后的频数)计算向量分量的加权平均值
  3. 将平均后的向量转换回极角,自动处理0/2π的一致性

修改后的代码如下:

import numpy as np
import matplotlib.pyplot as plt

a = np.random.rand(1000)*3.14*2
a = np.hstack((a,np.ones(100)*0.1))
a = np.hstack((a,np.ones(100)*3.1*2))
f = plt.figure()
ax = f.add_subplot(1,1,1,projection='polar')
n, bins = np.histogram(np.array(a), 50)
n = n / np.sum(n)
plt.hist((bins[0:-1] + bins[1:]) / 2, weights=n, bins=bins, rwidth=1.)

# 用向量法计算重心角度
binscenter = (bins[0:-1] + bins[1:]) / 2
# 计算每个bin中心的向量分量
x = np.cos(binscenter)
y = np.sin(binscenter)
# 加权平均得到重心向量
x_mean = np.sum(n * x) / np.sum(n)
y_mean = np.sum(n * y) / np.sum(n)
# 转换回极角,arctan2返回范围是[-π, π],转换为[0, 2π]
moyenne = np.arctan2(y_mean, x_mean)
if moyenne < 0:
    moyenne += 2 * np.pi

plt.scatter(moyenne, 0.1, c='r')
plt.show()

关键说明:

  • np.arctan2(y, x)会根据向量的象限返回正确的极角,自动处理0和2π方向的一致性
  • 当直方图中0和2π附近的权重占主导时,计算出的重心角度会趋近于0,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:45:25