为什么这些 numpy 操作不等效,我该如何解决这个问题?

Gra*_*ool 2 python arrays numpy

给定以下数组:

X = np.array([[1, 27, 3], [4, -1, 6]])
W = np.array([2, 4, 3])
Run Code Online (Sandbox Code Playgroud)

这两个方程是等价的:

sum_a = 0
for l in range(len(X)):
    sum_a += np.sum(W * X[l])   # 141
sum_b = np.sum(np.sum(W * X))   # 141
Run Code Online (Sandbox Code Playgroud)

但这两个不是:

sum_a = 0
for l in range(len(X)):
    sum_a += np.exp(np.sum(W * X[l]))   # 4.797813327299302e+51
sum_b = np.sum(np.exp(np.sum(W * X)))   # 1.7199742630376623e+61 
Run Code Online (Sandbox Code Playgroud)

为什么会这样?对于第二种情况,如何使 sum_b 等于 sum_a ?我特别想使用 numpy 使总和相等,这样我就可以向量化更大的方程。

Tim*_*rts 5

这些不是相同的操作。您希望e**119 + e**22== e**141,但这不是求幂的工作原理。您可以使其相同,但它是乘法运算,而不是加法运算:

sum_a = 1
for l in range(len(X)):
    sum_a *= np.exp(np.sum(W * X[l]))
sum_b = np.sum(np.exp(np.sum(W * X)))
Run Code Online (Sandbox Code Playgroud)

顺便说一句,np.sum最后一行的外部是无用的。内部np.sum返回单个值。

跟进

啊,所以你想要求和版本。您可以通过仅在一个轴上求和来做到这一点:

sum_b = np.sum(np.exp(np.sum(W * X, axis=1)))
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,这是愚蠢的,因为它比后者没有贡献e**119大得多。e**22