以下问题涉及在许多点上评估许多单项式 (x**k * y**l * z**m
)。
我想计算两个 numpy 数组的“内在力量”,即,
import numpy
a = numpy.random.rand(10, 3)
b = numpy.random.rand(3, 5)
out = numpy.ones((10, 5))
for i in range(10):
for j in range(5):
for k in range(3):
out[i, j] *= a[i, k]**b[k, j]
print(out.shape)
如果相反,该行将显示为
out[i, j] += a[i, k]*b[j, k]
这将是一些内积,可以用简单的点
或einsum
计算。
是否可以在一个 numpy 行中执行上述循环?
最佳答案
用对数来考虑它怎么样:
import numpy
a = numpy.random.rand(10, 3)
b = numpy.random.rand(3, 5)
out = np.exp(np.matmul(np.log(a), b))
因为c_ij = prod(a_ik ** b_kj, k=1..K)
,所以log(c_ij) = sum(log(a_ik) * b_ik, k=1。 .K)
.
注意:a
中有零 可能 会弄乱结果(也可能是负数,但无论如何结果都无法很好地定义)。我已经试过了,但它似乎并没有以某种方式真正崩溃;我不知道 NumPy 是否保证这种行为,但为了安全起见,您可以在末尾添加一些内容,例如:
out[np.logical_or.reduce(a < eps, axis=1)] = 0
关于python - 在许多点计算许多单项式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45420399/