使用 numpy 创建数字列表的概率分布的有效方法
Efficient way to create the probability distribution of a list of numbers with numpy
这是我正在尝试做的一个例子。假设以下 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]
有没有更快的方法获得“结果”?
编辑:是的,scipy.special.softmax 成功了
而不是尝试通过就地归一化来计算每个值(有效地将所有值相加,对每个值重复),而只是获取指数然后归一化一次在末尾。所以:
raw = np.exp(A)
result = A / sum(A)
(在我的测试中,内置 sum
的速度是 np.sum
的 2.5 倍以上,用于求和一个小数组。我没有用更大的数组进行测试。)
是:scipy.special.softmax成功了
from scipy.special import softmax
result = softmax(A)
谢谢@j1-lee 和@Karl Knechtel
这是我正在尝试做的一个例子。假设以下 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]
有没有更快的方法获得“结果”?
编辑:是的,scipy.special.softmax 成功了
而不是尝试通过就地归一化来计算每个值(有效地将所有值相加,对每个值重复),而只是获取指数然后归一化一次在末尾。所以:
raw = np.exp(A)
result = A / sum(A)
(在我的测试中,内置 sum
的速度是 np.sum
的 2.5 倍以上,用于求和一个小数组。我没有用更大的数组进行测试。)
是:scipy.special.softmax成功了
from scipy.special import softmax
result = softmax(A)
谢谢@j1-lee 和@Karl Knechtel