提高Cronbach Alpha代码python numpy的性能

use*_*006 2 python performance numpy

我制作了一些计算Cronbach Alpha的代码.但是我使用lambda函数并不太好.有没有办法通过使用lambda而不是svar()函数来减少代码并提高效率,并通过使用numpy数组来摆脱一些for循环?

import numpy as np


def svar(X):
    n = float(len(X))
    svar=(sum([(x-np.mean(X))**2 for x in X]) / n)* n/(n-1.)
    return svar


def CronbachAlpha(itemscores):
    itemvars = [svar(item) for item in itemscores]
    tscores = [0] * len(itemscores[0])
    for item in itemscores:
       for i in range(len(item)):
          tscores[i]+= item[i]
    nitems = len(itemscores)
    #print "total scores=", tscores, 'number of items=', nitems

    Calpha=nitems/(nitems-1.) * (1-sum(itemvars)/ svar(tscores))

    return Calpha

###########Test################
itemscores = [[ 4,14,3,3,23,4,52,3,33,3],
              [ 5,14,4,3,24,5,55,4,15,3]]
print "Cronbach alpha = ", CronbachAlpha(itemscores)
Run Code Online (Sandbox Code Playgroud)

use*_*ica 6

def CronbachAlpha(itemscores):
    itemscores = numpy.asarray(itemscores)
    itemvars = itemscores.var(axis=1, ddof=1)
    tscores = itemscores.sum(axis=0)
    nitems = len(itemscores)

    return nitems / (nitems-1.) * (1 - itemvars.sum() / tscores.var(ddof=1))
Run Code Online (Sandbox Code Playgroud)

NumPy内置了方差函数.指定ddof=1使用N-1的分母,给出样本方差.还有一个sum内置的.