我有以下代码,当我尝试附加B
时,它没有按预期添加。
B=[]
E = np.zeros(3)
for i in [1, 10, 30, 50]:
for j in range(3):
E1 = 0
for k in range(5):
Ene=k+rand()
E1 = E1 + Ene
E[j] = E1
B.append(E)
我得到以下结果:
[array([12.35627688, 12.16296235, 11.75953804]),
array([12.35627688, 12.16296235, 11.75953804]),
array([12.35627688, 12.16296235, 11.75953804]),
array([12.35627688, 12.16296235, 11.75953804])]
,它是E
的最后一个值的四倍。
但是,当我在第一个E = np.zeros(3)
循环之后移动for
时,得到的结果是B的每个分量的不同值。
我不明白为什么E = np.zeros(3)
在for循环之前,我在B中四次获得E的最后一个值。谁能帮我 ?
谢谢!
答案 0 :(得分:1)
当<rewrite>
<rules>
<rule name="Rewrite Item1">
<match url="^en/Home/Item1/([_0-9a-z-]+)" />
<action type="Rewrite" url="/en/Home/Item1?tab={R:1}" />
</rule>
</rules>
</rewrite>
在循环之前时,您仅创建一个数组,并将其附加4次到列表中。
更改值时,将更改同一数组,而当您查看E = np.zeros(3)
时,您将拥有4次相同的数组,因为它是同一对象。
将B
放在E = np.zeros(3)
内时,每次都在创建一个新数组,因此要追加不同的数组,并且当更改一个数组的值时,它们不会更改另一个数组。
您可以将最后一行更改为for
并创建B.append(np.copy(E))
的副本,从而将不同的数组追加到列表中。
答案 1 :(得分:1)
因为您在列表中添加了参考而不是E的副本,所以更改E也会更改B的内容。选中https://docs.python.org/3.8/library/copy.html以添加副本。为了安全起见,请使用Deepcopy。
import numpy as np
from random import random as rand
from copy import deepcopy
B = []
E = np.zeros(3)
for i in [1, 10, 30, 50]:
for j in range(3):
E1 = 0
for k in range(5):
Ene=k+rand()
E1 = E1 + Ene
E[j] = E1
B.append(deepcopy(E))
print(B)
xxx @ yyy:〜/ Desktop / test $ python3 test.py
[array([13.16046629,13.07833955,11.39445043]),array([11.70113908,11.59176892,12.9708855]),array
([12.85908412,12.8424841,12.62336043]),数组([12.23842107,13.02196394,12.54768361])]
答案 2 :(得分:0)
本质上,对B附加的同一数组有四个引用,您总是在更新单个内存单元,因此所有四个引用最终都具有相同的值。
为了提高效率,我建议简单地实例化完整的矩阵,而不是单独使用添加和添加行。
答案 3 :(得分:0)
您正在修改对E
变量的引用,因此对于所有条目,结果都是相同的数组。解决此问题而无需复制空E
数组的另一种方法是定义一个函数,该函数输出要附加到B
的随机数组。
因此您可以使用以下代码:
import numpy as np
from numpy.random import rand as rand
def randomArray():
E = np.zeros(3)
for j in range(3):
E1 = 0
for k in range(5):
Ene=k+rand()
E1 = E1 + Ene
E[j] = E1
return E
B=[]
for i in [1, 10, 30, 50]:
B.append(randomArray())
答案 4 :(得分:0)
您的Rand()函数是否未添加值尝试使用这种方法
import numpy as np
import random
B=[]
E = np.zeros(3)
for i in [1, 10, 30, 50]:
for j in range(3):
E1 = 0
for k in range(5):
Ene=k+random.random()
E1 = E1 + Ene
E[j] = E1
B.append(E)
print(E)