未找到已定义的函数

时间:2015-11-23 07:55:53

标签: python-2.7 numpy

我的脚本如下:

import numpy as np
import pandas as pd
import pdb

# conventions: W = fitness, A = affinity ; sex: 1=M, 0=F; alien: 1=alien,
# 0=native
# pop array order: W, A, sex, alien


def mkpop(n):
    W = np.repeat(a=1, repeats=n)
    A = np.random.normal(1, 0.1, size=n)
    A[A < 0] = 0
    alien = np.repeat(a=False, repeats=n)
    sex = np.random.randint(0, 2, n)
    pop = np.array([W, A, sex, alien])
    pop = np.transpose(pop)
    return pop


def migrate(pop, n=10, gParams=[1, 0.1]):
    W = np.random.gamma(shape=gParams[0], scale=gParams[1], size=n)
    A = np.repeat(1, n)
    # 0 is native; 1 is alien
    alien = np.repeat(True, n)
    # 0 is female
    sex = np.random.randint(0, 2, n)
    popAlien = np.array([W, A, sex, alien])
    popAlien = np.transpose(popAlien)
    pop = np.vstack((pop, popAlien))
    return pop


def mate(pop):
    # split into male and female
    f = pop[pop[:, 2] == 0]
    m = pop[pop[:, 2] == 1]
    # create transition matricies for native and alien mates
    # m with native = m.!alien.transpose * f.alien
    # negate alien
    naLog = list(np.asarray(m[:, 3]) == False)
    naPdMat = np.outer(naLog, f[:, 1])
    # mate with alien = m.alien.transpose * affinity
    alPdMat = np.outer(m[:, 3], f[:, 1])
    # add transition matrices for probability density matrix
    pdMat = alPdMat + naPdMat
    # transition matrix is equal to the pd matrix / column sumso
    colSums = np.sum(pdMat, axis=0)
    pMat = pdMat / colSums
    # select mates

    def choice(x):
        ch = np.random.choice(a=range(0, len(x)), p=x)
        return ch

    mCh = np.apply_along_axis(choice, 0, pMat)
    mCh = m[mCh, :]
    WMid = (f[:, 0] + mCh[:, 0]) / 2
    AMid = (f[:, 1] + mCh[:, 1]) / 2
    # assign fitness based on group affiliation; only native/alien matings have
    # modified fitness
    # reassign fitness and affinity based on group id and midparent vals
    W1 = np.where(
        (f[:, 3] == mCh[:, 3]) |
        ((f[:, 3] == 1) & (mCh[:, 3] == 0))
    )
    WMid[W1] = 1
    # number of offspring is a poisson-distributed variable with lambda=2W
    nOff = map(lambda x: np.random.poisson(lam=x), 2 * WMid)
    # generate offspring
    # expand list of nOff to numbers of offspring per pair
    # realized offspring is index posisions of W and A vals to be replicated
    # for offspring
    # this can be rewritten to return a matrix of the appropriate length. This
    # should work
    midVals = np.array([WMid, AMid]).T
    realOff = np.array([0, 0])
    for i in range(0, len(nOff)):
        sibs = np.repeat([np.array(midVals[i])], [nOff[i]], axis=0)
        realOff = np.vstack((realOff, sibs))
    offspring = np.delete(realOff, 0, 0)
    sex = np.random.randint(0, 2, len(offspring))
    alien = np.repeat(0, len(offspring))
    otherStats = np.array([sex, alien]).T
    offspring = np.hstack([offspring, otherStats])
    return offspring  # should return offspring


    def sim(nInit, nGen=100, nAlien=10, gParams=[1, 0.1]):
        gen = 0
        pop = mkpop
        stats = pd.DataFrame(columns=('gen', 'W', 'WMean', 'AMean', 'WVar', 'AVar'))
        while gen < nGen:
            pop = migrate(pop, nAlien, gParams)
            offspring = mate(pop)
            var = np.var(offspring, axis=0)
            mean = np.mean(offspring, axis=0)
            N = len(offspring)
            W = N / nInit
            genStats = N.append(W, gen, mean, var)
            stats = stats.append(genStats)
            print(N, gen)
            gen = gen + 1
        return stats

print mkpop(100)
print mate(mkpop(100))
#
sim(100, 100, 10, [1, 0.1])

运行此脚本,输出NameError: name 'sim' is not defined。从最后一个命令之前的命令可以明显看出,在这个脚本中定义的所有其他函数都可以顺利运行。我不确定这里发生了什么,可能有一些非常简单的修复,我忽略了。 Ctags很好地识别这个功能。完全可能sim()实际上还没有工作,因为我无法对其进行调试。

1 个答案:

答案 0 :(得分:1)

您在v1函数范围中定义的V1函数,因此它对全局范围不可见。您需要修复i1 <- SRC2[, Co:= as.character(round(sum(Exist)/.N, 2)) , sequenceID][, .I[1:(.N-1)], sequenceID]$V1 函数

的缩进