SciPy的binned_statistic_2d返回3d统计

zi8p0yeb  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(117)

我正在使用SciPy的binned_statistic_2d()函数来确定XArray Dataset中数据的分箱平均值。我的用法如下:

LTSbins = list(cloudcorrLTSw.LTS.values)[::5]
OMEGAbins = list(cloudcorrLTSw.OMEGA_700.values)[::5]
teststat = binned_statistic_2d(cloudcorrLTSw.LTS, cloudcorrLTSw.OMEGA_700, cloudcorrLTSw.CLD_RHO,
                               statistic=np.nanmean,bins=[LTSbins, OMEGAbins])

其中cloudcorrLTSw.LTScloudcorrLTSw.OMEGA_700cloudcorrLTSw.CLD_RHO是138个条目向量,前两个是xarray数据集的维度,后者是LTS-OMEGA_700空间上数据集中的变量。LTS、OMEGA_700和CLD_RHO数据本身来自从空间数据开发的时间序列,并且已经被变换成它们的当前状态,因此,作为结果,存在与坐标值一样多的CLD_RHO值,这意味着数据是稀疏的,每行和每列具有许多NaN。这就是使用np.nanmean作为统计量而不是内置均值函数的原因。
对于the SciPy documentation page for this function,,它旨在返回(除其他外)形状为(nx,ny)的ndarray,其中x和y由binned_statistic_2d函数调用中的bins kwarg确定。然而,我得到的是一个138 x27 x27(27 x27,因为所描述的合并导致28个值),第一维完全是NaN。因此,我必须通过np.nanmean * 再次 * 传递teststat.statistic,以删除多余的维度,这个操作并不需要太多时间,但会让我担心会干扰数据。我把稀疏的数据插入图中可能是明智的,

但这本身就是另一个问题了所以,在我解决这个问题之前,这是binned_statistic_2d()的预期输出吗?
更新图片以遵循some 3128的建议:

根据some 3128的答案使用statistic = 'count'更新了图像:

我使用的数据,我通过创建一个xarray对象,使用LTS和omega作为坐标,CLD_RHO作为这些轴上的变量,“强迫”在LTS-omega空间中。通过使用原始数据(预先制作一个新的数据集),我能够得到 * 这个 * 图像,这似乎更合理。我想我可以把这当作解决了。

sqserrrh

sqserrrh1#

我合成了一些测试数据(rho中有50%的NaN),并通过binning函数运行它。结果和代码如下。
数据类型:

使用热图可视化的分箱函数的输出:

当我对数据进行装箱时,我将统计量设置为"count"。这提供了对每个括号中的观测数的完整性检查。binning函数还返回bin的边缘值,我已经将其覆盖到图上。颜色反映了散点图上原始数据的密度,所以看起来很有意义。

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)

#Mock data
n_pts = 138
lts1 = np.random.uniform(-0.4, 1, n_pts // 2)
lts2 = np.random.randn(n_pts // 2) * 0.1 - 0.1
lts = np.empty(n_pts)
lts[::2] = lts1
lts[1::2] = lts2

hpa = np.random.uniform(-0.001, 0.0015, n_pts)
#rho has 50% NaNs
rho = np.random.randn(n_pts) + np.where(np.random.uniform(size=n_pts) > 0.5, np.nan, 0)

#View the data
plt.scatter(lts, hpa, c=rho, label='rho')
plt.ylabel('hpa')
plt.xlabel('lts')
plt.legend()
plt.show()
import seaborn as sns
import scipy

#2D binning
#hpa is the "first dimension" (row index), which the function refers to as "x"
#  on the plots, this is actually the y axis
statistic, hpa_edge, lts_edge, binnumber = scipy.stats.binned_statistic_2d(
    hpa, lts, rho, statistic='count', bins=9
)

#Plot
sns.heatmap(statistic, annot=True,
            xticklabels=np.round(lts_edge, 1),
            yticklabels=np.round(hpa_edge * 1e3, 1),
            cmap='plasma')
plt.gca().set_ylabel('hpa * 1e3 bin')
plt.gca().set_xlabel('lts bin')
plt.gca().invert_yaxis()

我认为如果你能通过上面的步骤运行你的数据,这将是值得一看的。

7eumitmz

7eumitmz2#

看起来您可能面临一个问题,要么是在使用函数的方式上,要么是由于输入数据的特征。一个可能的原因可能与您如何使用LTSbins和OMEGAbins列表定义bin有关。值得确认的是,这些列表准确地表示了您打算使用的条格边缘。
此外,最好验证数组cloudcorrLTSw.LTS、cloudcorrLTSw.OMEGA_700和cloudcorrLTSw.CLD_RHO是否具有正确的形状,并与您尝试实现的分箱策略正确对齐。如果这些数组中的任何一个具有意外的形状或包含NaN值,则它们可能会导致您在binned_statistic_2d函数中看到的意外行为。像这样的问题有时会导致结果不太符合你的最初期望。

相关问题