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

如何基于耦合的粒子位置数组X和速度数组V计算各分箱的速度方差

实现方法

你可以通过np.digitize先建立每个位置样本到分箱的映射关系,再基于映射统计每个分箱的速度方差,以下是两种可直接运行的实现方案:

方案1:纯Numpy实现(无额外依赖)

不需要安装其他第三方库,完全兼容你现有代码逻辑:

import numpy as np
import matplotlib.pyplot as plt

X = np.random.randn(1000)
V = 3*np.random.randn(1000) + 40

bins = np.arange(int(X.min()) - 0.5, int(X.max())+1.5, 1)
# 1. 获取每个X元素对应的分箱索引,即你需要的元素-分箱映射关系
bin_indices = np.digitize(X, bins)
# 过滤出在分箱范围内的有效样本
valid_mask = (bin_indices > 0) & (bin_indices < len(bins))
valid_bin_idx = bin_indices[valid_mask]
valid_V = V[valid_mask]

# 2. 计算每个分箱的速度方差,空分箱默认填充nan
v_var = np.full(len(bins)-1, np.nan)
for i in range(1, len(bins)):
    bin_v = valid_V[valid_bin_idx == i]
    # 至少2个样本才计算方差,可根据需求调整规则
    if len(bin_v) >= 2:
        v_var[i-1] = np.var(bin_v)

# 3. 原有直方图绘制逻辑不变
plt.hist(X, bins=bins, facecolor = '#2ab0ff', edgecolor='#169acf', linewidth=0.7)
plt.show()

# 可直接输出每个分箱中心对应的方差结果
bin_centers = (bins[:-1] + bins[1:]) / 2
for center, var in zip(bin_centers, v_var):
    print(f"分箱中心{center:.0f},速度方差:{var if not np.isnan(var) else '无有效样本'}")

方案2:Scipy简洁实现

如果允许引入scipy依赖,可直接调用封装好的分箱统计函数,一行完成计算:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binned_statistic

X = np.random.randn(1000)
V = 3*np.random.randn(1000) + 40
bins = np.arange(int(X.min()) - 0.5, int(X.max())+1.5, 1)

# 直接按X分箱,统计对应V的方差,返回结果顺序和直方图分箱完全对齐
v_var, bins, bin_mapping = binned_statistic(X, V, statistic='var', bins=bins)

plt.hist(X, bins=bins, facecolor = '#2ab0ff', edgecolor='#169acf', linewidth=0.7)
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:45:03