使用Python列表更新numpy数组时出现意外行为 t=0 abig=零((10000150)) aa=[0代表范围(150)内的i] 打印abig[0] 而1: aa=abig[t] 对于范围(150)内的k: 对于范围(150)内的i: ppp=aa[k]+nk[k]*(1-iris[k][3]*aa[i]*iris[i][3]*kk[i][k]) aa[k]=购买力平价 如果aa[k]10: aa[k]=10 打印abig[0] abig[t+1]=aa t=t+1 sds=减法(abig[t-1],abig[t]) 如果norm(sds)
代码中有几个问题(除了变量名的选择)。第一,做:使用Python列表更新numpy数组时出现意外行为 t=0 abig=零((10000150)) aa=[0代表范围(150)内的i] 打印abig[0] 而1: aa=abig[t] 对于范围(150)内的k: 对于范围(150)内的i: ppp=aa[k]+nk[k]*(1-iris[k][3]*aa[i]*iris[i][3]*kk[i][k]) aa[k]=购买力平价 如果aa[k]10: aa[k]=10 打印abig[0] abig[t+1]=aa t=t+1 sds=减法(abig[t-1],abig[t]) 如果norm(sds),python,numpy,Python,Numpy,代码中有几个问题(除了变量名的选择)。第一,做: t=0 abig= zeros((10000,150)) aa=[0 for i in range(150)] print abig[0] while 1: aa=abig[t] for k in range(150): for i in range(150): ppp=aa[k]+nk[k]*(1-iris[k][3]*aa[i]*iris[i][3]*kk
t=0
abig= zeros((10000,150))
aa=[0 for i in range(150)]
print abig[0]
while 1:
aa=abig[t]
for k in range(150):
for i in range(150):
ppp=aa[k]+nk[k]*(1-iris[k][3]*aa[i]*iris[i][3]*kk[i][k])
aa[k]=ppp
if aa[k]<0:
aa[k]=0
if aa[k]>10:
aa[k]=10
print abig[0]
abig[t+1]=aa
t=t+1
sds=subtract(abig[t-1],abig[t])
if norm(sds)<0.0001:
break
print t
print aa
不复制abig[t]
。相反,aa
和abig[t]
引用相同的数据,因此如果您执行以下操作:
aa=abig[t]
然后自动
aa[1] = 20
另一方面,作业的顺序可能是错误的。我想你想要的是:
abig[t][1] = 20
由于abig
似乎是numpy
数组,因此隐式使用了copy
方法,因此abig[t]
是aa
的副本(它们不共享数据)
现在正在做:
abig[t] = aa
不会更改aa[1]
其次,这部分代码:
abig[t][1] = 20
与以下内容相同:
for i in range(150):
ppp=aa[k]+nk[k]*(1-iris[k][3]*aa[i]*iris[i][3]*kk[i][k])
aa[k]=ppp
因此,循环是无用的。我想你真正的意思是
aa[k]=aa[k]+nk[k]*(1-iris[k][3]*aa[149]*iris[149][3]*kk[149][k])
(但不完全确定)
总之,在您当前的实现中,
aa
,abig[t]
和abig[t+1]
都引用相同的数据,因此当您减去连续行时,会得到一堆零。这些是我见过的最糟糕的变量名。这甚至会给用户留下深刻印象+1对于荒谬代码的英雄解释,这只是一件小事,因为他表面上在使用numpy,所以abig[t+1]=aa
实际上是可以的。第一个aa=…
不是副本是关键,这取决于它应该做什么,在那里添加.copy()
应该可以解决这个问题,尽管我想这会留下很多矢量化和清理工作。@seberg谢谢你的评论。我已经相应地更新了我的答案。
for i in range(150):
aa[k]=aa[k]+nk[k]*(1-iris[k][3]*aa[i]*iris[i][3]*kk[i][k])