【问题标题】:numpy cumulative product: normalizing result after each prod operation along axisnumpy 累积乘积:沿轴进行每个 prod 操作后的归一化结果
【发布时间】:2013-07-19 19:03:29
【问题描述】:

我有一个数组,例如 (2,1000) 形状。我需要沿轴 = 1 获得累积乘积,这不是问题,但如果我的数字低于 1 - 它们很快会变为零,如果它们高于 1 - 它们会很快达到 Inf。问题是,在每次产品操作之后,是否有任何方法可以在没有循环的情况下沿轴 = 0(即按总和)标准化每一列?

a = np.random.randint(1, 10, (2,1000)).astype('float')
p = np.cumprod(a, axis=1)
print p[:,-1]

这给了我 [inf inf]

a = np.random.random((2,1000))
p = np.cumprod(a, axis=1)
print p[:,-1]

这给了我 [0. 0.]

我想要类似的东西 [0.5, 0.5]

这就像现在的部分解决方案:

vars = 100
a = np.random.random((vars, 1000))
p = np.ones((vars, 1))
step_window = 100
step = int(a.shape[1]/step_window)
for i in range(step):
    temp = np.cumprod(a[:, i*step_window:(i+1)*step_window], axis=1) 
    temp[:,-1] /= temp[:,-1].sum() 
    p *= temp[:,-1].reshape((vars, 1)) 
    p /= p.sum() '

【问题讨论】:

  • 您应该将部分解决方案添加到问题中,而不是将其留在评论中。
  • 感谢您的建议,已添加

标签: python arrays numpy normalization


【解决方案1】:

我不太确定我是否非常了解您的算法,但可以说您的数组是:

[[a c e g]
 [b d f h]]

如果我猜对了,您将首先计算 a*cb*d,然后在乘以 ef 之前,将这两个数字除以 a*c + b*d,得到 a*c / (a*c + b*d) 和 @ 987654329@。当您乘以ef 时,您的新归一化因子为(a*c*e + b*d*f) / (a*c + b*d),下一次乘法之前的结果值为a*c*e / (a*c*e + b*d*f)b*d*f / (a*c*e + b*d*f)。您可能会看到正在出现的模式...

如果你将这些表达式除以分子,你会得到1 / (1 + a*c*e/b/d/f)1 / (1 + b*d*f/a/c/e),所以你可以得到计算两行比率乘积的结果:

a = np.random.random((2, 1000))
temp = np.cumprod(a[1] / a[0])
p = 1 / (1 + np.vstack((temp, 1/temp)))

不过,您对结果为[0.5, 0.5] 的期望似乎并不正确,因为它似乎在[0, 1][1, 0] 之间快速摆动。

【讨论】:

  • 这适用于第 0 个axis.shape = 2,尽管形状更大,但似乎不适用,尽管您完全明白我的意思,谢谢。至于 [0.5 0.5] 的期望,我认为纯随机数生成器(不是伪)会这样做..也许我错了。无论如何,我的原始任务中没有随机数:)
  • 如果第 0 轴有两个以上的项目,你可以产生类似的结果,但它会涉及更多的项目比率,例如对于三项第 0 轴,您可以执行 t10 = np.cumprod(a[1] / a[0]); t20 = np.cumprod(a[1] / a[0]); t21 = np.cumprod(a[2] / a[1]); p = np.vstack((1/(1+t10+t20), 1/(1+1/t10+t21), 1/(1+1/t20+1/t21))) 之类的操作。至于期望值,我认为没有浮点错误,你会得到一个不断振荡的结果。所有值的平均值可能会收敛到 0.5,但实际值不会。
  • 我的案例大约有 100 行,打字太多了 :) 并且我不熟悉基本的 FP 错误,所以我更愿意在这个案例上同意你的看法
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 2022-07-26
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多