这是我正在努力做的一个例子。假设下面的numpy数组:
A = np.array([3, 0, 1, 5, 7]) # in practice, this array is a huge array of float numbers: A.shape[0] >= 1000000
我需要最快的方法来获得以下结果:
result = []
for a in A:
result.append( 1 / np.exp(A - a).sum() )
result = np.array(result)
print(result)
>>> [1.58297157e-02 7.88115138e-04 2.14231906e-03 1.16966657e-01 8.64273193e-01]
选项1(比以前的代码更快):
result = 1 / np.exp(A - A[:,None]).sum(axis=1)
print(result)
>>> [1.58297157e-02 7.88115138e-04 2.14231906e-03 1.16966657e-01 8.64273193e-01]
有没有更快的方法来获得“结果”?
2条答案
按热度按时间1tuwyuhd1#
而不是试图通过在适当的位置将其归一化来计算每个值(有效地将所有值相加,* 重复每个 * 值),而是仅获得指数,然后在最后归一化一次。所以:
(In我的测试,内置的
sum
是2.5倍以上的速度为np.sum
求和一个小数组。我没有用更大的测试)。hsgswve42#
是的:scipy.special.softmax做到了
感谢@j1-lee和@Karl Knechtel