【发布时间】:2015-11-18 17:01:13
【问题描述】:
所以,基本上,我有一个这样的 python 2.7 代码:
femalebreeders = [[[0] * 4] * n] * pat
femalebreeders1 = [[[0] * 4] * n] * pat
for y in range(pat):
for x in range(n):
Indivmales[y][x] = malebreeders[y][x][0] + malebreeders[y][x][3]
Fec1[y] = 1 - c * numpy.array(numpy.mean(Indivmales[y]))
FecMales = numpy.ndarray.tolist(1 + (numpy.array(Indivmales) * b) - (numpy.array(Indivmales) * u))
Fec = [0 if i < 0 else i for i in Fec1]
FecPop = numpy.mean(Fec)
FecCalcF[y] = (Fec[y] * (1 - mf)) / ((Fec[y] * (1 - mf)) + (FecPop * mf))
FecCalcF2[y] = (Fec[y] * mf) / FecPop
FecCalcM[y] = (Fec[y] * (1 - mm)) / ((Fec[y] * (1 - mm)) + (FecPop * mm))
FecCalcM2[y] = (Fec[y] * mm) / FecPop
for x in range(n):
for y in range(pat):
if random.random() < FecCalcF[y]:
z = y
else:
z = numpy.random.choice(pat, p=numpy.ndarray.tolist(numpy.array(FecCalcF2)/sum(FecCalcF2)))
f = random.randrange(n)
m = random.randrange(n)
if random.random() < mut:
if random.random() < 0.5:
femalebreeders1[y][x][0] = femalebreeders[z][f][0] + \
random.uniform(-1, 1)
一些背景。 n 是个体数量,pat 是个体所在的块数。 FecCalcF 和 FecCalcF2 只是表示个人是否要迁移的变量(假设他们总是迁移到新补丁)。 所以,我想为每个人分配一个补丁(y)。而且,因为他们总是迁移,他们的父母来自另一个补丁 (z),这取决于每个补丁上个体的繁殖力。 最后,我希望拥有来自不同地区的不同女性。但是,雌性育种者的值类似于 ([0.10, 0, 0, 0], [0.10, 0, 0, 0] .... ]。基本上,第一个值对于所有这些值总是相等的(并且其他值也是一样的,我只是展示了一部分我做错了吗?
【问题讨论】:
-
你在哪里初始化
femalebreeders?看起来您可能使用相同的引用实现了所有列表,因此更改一个列表将更改所有列表 -
我在循环外初始化了 femalebreeders,它的定义是这样的:
femalebreeders1 = [[[0] * 4] * n] * pat4 是因为有 4 个等位基因 -
编辑您的问题并添加您初始化的代码
-
用列表推导替换你所有的
*。所以应该是[[[0] * 4] for i in range(n)] for j in range(pat)]
标签: python if-statement for-loop