下面的问题涉及在多个点上评估多个单项式(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]
这将是许多内积,可以用简单的dot
或einsum
计算。
是否可以在一个numpy行中执行上面的循环?
4条答案
按热度按时间ars1skjm1#
用对数来考虑它怎么样:
因为
c_ij = prod(a_ik ** b_kj, k=1..K)
,所以log(c_ij) = sum(log(a_ik) * b_ik, k=1..K)
。注意:在
a
中有零 * 可能 * 会搞乱结果(也是负数,但结果无论如何都不会被很好地定义)。我不知道NumPy是否保证了这种行为,但为了安全起见,你可以在最后添加一些东西,比如:js4nwp542#
您可以在将这些数组扩展到
3D
版本后使用broadcasting
-简单地说-
基本上,我们保持两个数组的最后一个轴和第一个轴对齐,同时在两个输入的第一个轴和最后一个轴之间执行元素幂。
jhdbpxl93#
还有两种解决方案:
内联
使用
power.outer
:两者都比广播解决方案慢一点。
用于重现绘图的代码:
sulc1iza4#