gpt4 book ai didi

python - numpy累积乘积: normalizing result after each prod operation along axis

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:32 25 4
gpt4 key购买 nike

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

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

这给了我 [infinf]

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() '

最佳答案

我不太确定我是否很好地理解了你的算法,但可以说你的数组是:

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

如果我没理解错的话,您将首先计算 a*cb*d,然后再乘以 ef,将两个数字除以 a*c + b*d,得到 a*c/(a*c + b*d)b*d/(a*c + b*d)。当您乘以 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]

enter image description here

关于python - numpy累积乘积: normalizing result after each prod operation along axis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17763961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com