在Python中,使用numpy按列计算数组的softmax

Kur*_*eek 3 python arrays numpy softmax

https://classroom.udacity.com/courses/ud730/lessons/6370362152/concepts/63815621490923之后,我正在尝试编写一个"softmax"函数,当给定一个二维数组作为输入时,计算softmax每一栏.我编写了以下脚本来测试它:

import numpy as np

#scores=np.array([1.0,2.0,3.0])

scores=np.array([[1,2,3,6],
                [2,4,5,6],
                [3,8,7,6]])

def softmax(x):
    if x.ndim==1:
        S=np.sum(np.exp(x))
        return np.exp(x)/S
    elif x.ndim==2:
        result=np.zeros_like(x)
        M,N=x.shape
        for n in range(N):
            S=np.sum(np.exp(x[:,n]))
            result[:,n]=np.exp(x[:,n])/S
        return result
    else:
        print("The input array is not 1- or 2-dimensional.")

s=softmax(scores)
print(s)
Run Code Online (Sandbox Code Playgroud)

但是,结果"s"结果是一个零数组:

[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]
Run Code Online (Sandbox Code Playgroud)

如果我删除for循环中的"/ S",那么'未规范化'的结果就像我预期的那样; 某种程度上,"/ S"除法似乎使所有元素为零,而不是像我期望的那样将每个元素除以S. 代码有什么问题?

Kur*_*eek 6

"零"的原因在于输入的数据类型,它们是"int"类型.将输入转换为"float"解决了以下问题:

import numpy as np

#scores=np.array([1.0,2.0,3.0])

scores=np.array([[1,2,3,6],
                [2,4,5,6],
                [3,8,7,6]])

def softmax(x):
    x=x.astype(float)
    if x.ndim==1:
        S=np.sum(np.exp(x))
        return np.exp(x)/S
    elif x.ndim==2:
        result=np.zeros_like(x)
        M,N=x.shape
        for n in range(N):
            S=np.sum(np.exp(x[:,n]))
            result[:,n]=np.exp(x[:,n])/S
        return result
    else:
        print("The input array is not 1- or 2-dimensional.")

s=softmax(scores)
print(s)
Run Code Online (Sandbox Code Playgroud)

请注意,我已将"x = x.astype(float)"添加到函数定义的第一行.这产生了预期的输出:

[[ 0.09003057  0.00242826  0.01587624  0.33333333]
 [ 0.24472847  0.01794253  0.11731043  0.33333333]
 [ 0.66524096  0.97962921  0.86681333  0.33333333]]
Run Code Online (Sandbox Code Playgroud)