1

我有一个数组,例如 (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() '
4

1 回答 1

1

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

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

如果我猜对了,您将首先计算a*cand b*d,然后乘以eand f,您将两个数字除以a*c + b*d, 并得到a*c / (a*c + b*d)and b*d / (a*c + b*d)。当您乘以eandf时,您的新归一化因子是(a*c*e + b*d*f) / (a*c + b*d),而下一次乘法之前的结果值是a*c*e / (a*c*e + b*d*f)and 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]

在此处输入图像描述

于 2013-07-20T17:59:06.330 回答