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

标签 python arrays numpy

给定以下数组:

X = np.array([[1, 27, 3], [4, -1, 6]])
W = np.array([2, 4, 3])

这两个方程是等价的:

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

但这两个不是:

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 

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

最佳答案

这些不是相同的操作。您希望 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)))

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

跟进

啊,所以你想要求和版本。您只需在一个轴上求和即可做到这一点:

sum_b = np.sum(np.exp(np.sum(W * X, axis=1)))

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

关于python - 为什么这些 numpy 操作不等效,我该如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69530815/

相关文章:

python - 计算 Pandas 中的重复 block

javascript - JavaScript 和 Python 2.7 中 JSON 字符串中的转义反斜杠

c - 什么突出表现更好?

python - numpy 矩阵乘法

python - Django :哪几天有对象?

python - 将多个字符串列表转换为 Python 数据框

python - 使用 np.interp 查找给定 y 的 x 值会给出错误的答案

C#初始化数组

python - 如何获得与 SciPy 稀疏矩阵中特定行对应的向量的范数?

python - 有条件地对齐两个数据帧,以便导出作为 numpy 条件传入的列,其中