【问题标题】:Apply truncnorm and draw to 3d arrays of parameters应用 truncnorm 并绘制到 3d 参数数组
【发布时间】:2020-11-04 19:25:13
【问题描述】:

我有两个 3D 数组 meanstd,它们的名称分别包含平均值和标准差。两个数组具有相同的形状,因此这两个表中每个位置的平均值和标准偏差之间存在对应关系。我想,对于数组的每个位置,使用mean 中的值和std 中的相应值来定义一个截断的正态分布,我从中绘制一个值,并将其存储在另一个数组中的相应位置@ 987654325@ 与meanstd 具有相同的形状。

当然,我也想过使用scipy.stats.truncnorm,但是我遇到了广播问题,我对如何优雅地使用它有点迷茫。 for 循环会花费太多时间,因为其目的是将这个过程应用于非常大的数组。

作为一个简单的例子,让我们考虑

mean = [[[4 0]
         [1 3]]
        [[3 1]
         [3 4]]]
std = [[[0.84700368 0.78628226]
        [0.54893714 0.68086502]]
       [[0.23237688 0.46543749]
        [0.01420151 0.25461322]]]

为简单起见,我将p 初始化为一个包含索引的数组:

p = [[[1 2]
      [3 4]]
     [[5 6]
      [7 8]]]

例如,我想将 p 中的值 5 替换为从均值 3 和标准差的截断正态分布(比如在用户选择的值 lowerupper 之间截断)随机抽取的值0.23237688,在meanstd 的相应位置给出。目的是一次将此过程应用于所有值。

提前感谢您的回答!

【问题讨论】:

  • 在给定均值和标准差的值对的情况下,您是如何计算截断正态分布的?

标签: python arrays numpy scipy


【解决方案1】:

这比你想象的要容易。

mean = np.array([[[4, 0],
         [1, 3]],
        [[3, 1],
         [3, 4]]])

std = np.array([[[0.84700368, 0.78628226],
        [0.54893714, 0.68086502]],
       [[0.23237688, 0.46543749],
        [0.01420151, 0.25461322]]])


lower = 1
upper = 3

# from the documentation of truncnorm:
a, b = (lower - mean) / std, (upper - mean) / std

from scipy.stats import truncnorm
# remove random_state from parameters if you don't want reproducible
# results.
p = truncnorm.rvs(a, b, loc=mean, scale=std, random_state=1)
print(np.around(p, 2))

# output:
[[[2.6  1.5 ]
  [1.   2.3 ]]

 [[2.66 1.05]
  [2.98 2.94]]]

【讨论】:

    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多