Python中矢量化代码和朴素循环代码的不同结果

Python中矢量化代码和朴素循环代码的不同结果,python,numpy,vectorization,Python,Numpy,Vectorization,上面是我的玩具代码。运行之后,我得到了以下输出。最后两行中的差异更为明显。虽然这没什么大不了的,但当N很大时,这就成了一个问题。我想知道为什么这两个看起来相同的代码之间有如此大的差异。我查阅了一些博客,但它们大多是关于数据依赖性和操作顺序的,几乎没有提供什么帮助。Thx提前 logPi=np.random.normal(0,1,3)+10 logB=np.random.normal(0,1,(5,3))+10 logA=np.random.normal(0,1,(3,3))+10 logPi=n

上面是我的玩具代码。运行之后,我得到了以下输出。最后两行中的差异更为明显。虽然这没什么大不了的,但当N很大时,这就成了一个问题。我想知道为什么这两个看起来相同的代码之间有如此大的差异。我查阅了一些博客,但它们大多是关于数据依赖性和操作顺序的,几乎没有提供什么帮助。Thx提前

logPi=np.random.normal(0,1,3)+10
logB=np.random.normal(0,1,(5,3))+10
logA=np.random.normal(0,1,(3,3))+10
logPi=np.log(logPi/np.sum(logPi))
logA=np.log(logA/np.sum(logA,axis=1,keepdims=1))
logB=np.log(logB/np.sum(logB,axis=1,keepdims=1))
N, M = logB.shape


theta = np.zeros_like(logB)
theta[0] = logPi + logB[0]
for t in range(1,N):
    for i in range(M):
        temp = theta[t-1]+logA.T[i]+logB[t][i]
        theta[t][i]=np.max(temp)
print("loop:\n",theta)


theta = np.zeros_like(logB)
theta[0] = logPi + logB[0]
for t in range(1,N):
    temp = theta[t-1]+logA.T+logB[t]    #theta[t-1]:(3,) logA.T (3,3) logB[t]:(3,)
    theta[t]=np.max(temp,axis=0)
print("vectorized:\n",theta)

矢量化与循环代码不同。首先为
logA.T
的每一行添加
logB[T]
的一些值。因此,对于矢量化形式,您应该添加转置的
logB[t]
。第二个循环代码是沿着
logA.T
行找到的最大值,因此在矢量化形式中,应该使用
axis=1
。代码也是如此

loop:
[[ -2.13807344  -2.08414176  -2.40187496]
[ -4.18153958  -4.13865644  -4.37805603]
[ -6.16769508  -6.28860493  -6.3818191 ]
[ -8.26547308  -8.33614274  -8.36669173]
[-10.47121378 -10.35391286 -10.38243085]]
vectorized:
[[ -2.13807344  -2.08414176  -2.40187496]
[ -4.23034598  -4.08985004  -4.60149803]
[ -6.25425934  -6.20204067  -6.76141802]
[ -8.22600221  -8.3756136   -8.92005515]
[-10.35594798 -10.46917867 -10.9966534 ]]
我得到输出:

import numpy as np
np.random.seed(13)
logPi=np.random.normal(0,1,3)+10
logB=np.random.normal(0,1,(5,3))+10
logA=np.random.normal(0,1,(3,3))+10
logPi=np.log(logPi/np.sum(logPi))
logA=np.log(logA/np.sum(logA,axis=1,keepdims=1))
logB=np.log(logB/np.sum(logB,axis=1,keepdims=1))
N, M = logB.shape


theta = np.zeros_like(logB)
theta[0] = logPi + logB[0]
for t in range(1,N):
    for i in range(M):
        temp = theta[t-1]+logA.T[i]+logB[t][i]
        theta[t][i]=np.max(temp)
print("loop:\n",theta)


theta = np.zeros_like(logB)
theta[0] = logPi + logB[0]
for t in range(1,N):
    temp = theta[t-1]+logA.T+logB[t].reshape(-1, 1)    #theta[t-1]:(3,) logA.T (3,3) logB[t]:(3,)
    theta[t]=np.max(temp,axis=1)
print("vectorized:\n",theta)

矢量化与循环代码不同。首先为
logA.T
的每一行添加
logB[T]
的一些值。因此,对于矢量化形式,您应该添加转置的
logB[t]
。第二个循环代码是沿着
logA.T
行找到的最大值,因此在矢量化形式中,应该使用
axis=1
。代码也是如此

loop:
[[ -2.13807344  -2.08414176  -2.40187496]
[ -4.18153958  -4.13865644  -4.37805603]
[ -6.16769508  -6.28860493  -6.3818191 ]
[ -8.26547308  -8.33614274  -8.36669173]
[-10.47121378 -10.35391286 -10.38243085]]
vectorized:
[[ -2.13807344  -2.08414176  -2.40187496]
[ -4.23034598  -4.08985004  -4.60149803]
[ -6.25425934  -6.20204067  -6.76141802]
[ -8.22600221  -8.3756136   -8.92005515]
[-10.35594798 -10.46917867 -10.9966534 ]]
我得到输出:

import numpy as np
np.random.seed(13)
logPi=np.random.normal(0,1,3)+10
logB=np.random.normal(0,1,(5,3))+10
logA=np.random.normal(0,1,(3,3))+10
logPi=np.log(logPi/np.sum(logPi))
logA=np.log(logA/np.sum(logA,axis=1,keepdims=1))
logB=np.log(logB/np.sum(logB,axis=1,keepdims=1))
N, M = logB.shape


theta = np.zeros_like(logB)
theta[0] = logPi + logB[0]
for t in range(1,N):
    for i in range(M):
        temp = theta[t-1]+logA.T[i]+logB[t][i]
        theta[t][i]=np.max(temp)
print("loop:\n",theta)


theta = np.zeros_like(logB)
theta[0] = logPi + logB[0]
for t in range(1,N):
    temp = theta[t-1]+logA.T+logB[t].reshape(-1, 1)    #theta[t-1]:(3,) logA.T (3,3) logB[t]:(3,)
    theta[t]=np.max(temp,axis=1)
print("vectorized:\n",theta)