【问题标题】:CDF plot of 3D np.array()3D np.array() 的 CDF 图
【发布时间】:2021-11-22 03:18:33
【问题描述】:

我有三个具有以下形状的 np 数组:

# (176 x 104)  
mean_displacement

# (176 x 104 x 15) 15 values for each displacement
displacement_distribution

# (176 x 104 x 15) 15 weights/probability for each displacement
weights

现在我想计算它的CDF,但我遇到了麻烦,因为这是我第一次使用多维数组。必须为每个像素的所有位移计算 CDF。将有 18,304 个像素,CDF 绘图位于此区域内:

(displacement[range(136, 163), :][:, range(0, 18)]) if displacement >= 0.1

这将从图中删除所有位移小于0.1 的单元格。

只需要一些见解,这里是a Google drive link for the three np array files 和下面的示例:

>>> weights
[
    [[0.123704][0.092778][0.092778][0.092778]]
    [[0.123704][0.092778][0.092778][0.092778]]
    [[0.123704][0.123704][0.123704][0.123704]]
    ...
]

>>> displacement_distribution
[
    [[0.1][0.1][0.1][0.1]]
    [[0.1][0.1][0.1][0.1]]
    ...
]

这是CDF 绘图的草图:

【问题讨论】:

  • 您能否说明如何针对mean_displacementdisplacement_distributionweights 定义CDF。在一维情况下,它们分别是一个标量和两个 15 元素向量,对吗?
  • mean_displacement 显示每个单元/像素的平均位移,displacement_distribution:对于每个像素,有 15 个位移值 weights:对于每个像素,有 15 个概率/权重与15 个位移值中的每一个
  • imgur.com/a/ZotBUGo">
  • 您能提供一些示例数据吗?
  • 我在哪里可以将 numpy 数组文件发送给您?

标签: python numpy plot cdf


【解决方案1】:

这是我曾经想出的 pandas 单线。您也许可以将它用于循环中的每一列。

import scipy.stats as sst
import numpy as np, pandas as pd 
#dummy data
distr=sst.beta(12,12)
values=distr.rvs(50)


cdf=pd.Series(np.ones(values.shape[0])/values.shape[0], index=values).sort_index().cumsum()

以下是在 pandas 的一张图表上绘制多个 cdf 示例的视觉测试。

distr=sst.beta(12,12)
values=distr.rvs(20000)

cdf20k=pd.Series(np.ones(values.shape[0])/values.shape[0], index=values).sort_index().cumsum()

values=distr.rvs(50)
cdf50=pd.Series(np.ones(values.shape[0])/values.shape[0], index=values).sort_index().cumsum()

pd.DataFrame({
'theo':pd.Series(distr.cdf(np.arange(0,1,0.001)),np.arange(0,1,0.001)),
'empirical_20k_samples': cdf20k,
'empirical_50_samples': cdf50,
    }).fillna(method='ffill').plot()

【讨论】:

  • 是的 CDF 是累积分布函数,我试过你的一个衬里,但它只是给出了一条从 0-176(行 len)的直线
  • 我发给你的函数是用来计算值表中数据的 cdf。如果例如,它将给出直线样本在区间内分布均匀。