使用numpy创建数字列表的概率分布的有效方法

g6ll5ycj  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(100)

这是我正在努力做的一个例子。假设下面的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]

有没有更快的方法来获得“结果”?

1tuwyuhd

1tuwyuhd1#

而不是试图通过在适当的位置将其归一化来计算每个值(有效地将所有值相加,* 重复每个 * 值),而是仅获得指数,然后在最后归一化一次。所以:

raw = np.exp(A)
result = A / sum(A)

(In我的测试,内置的sum是2.5倍以上的速度为np.sum求和一个小数组。我没有用更大的测试)。

hsgswve4

hsgswve42#

是的:scipy.special.softmax做到了

from scipy.special import softmax

result = softmax(A)

感谢@j1-lee和@Karl Knechtel

相关问题