最后一列附加python
我有以下代码,当我尝试追加我的最后一列附加python,python,Python,我有以下代码,当我尝试追加我的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.3562
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
最后一个值的四倍。
但是当我在第一个for
循环之后移动E=np.zero(3)
时,我得到了我想要的结果,即B的每个分量上的不同值
我不明白为什么当E=np.zero(3)
在for循环之前时,我在B中四次得到E的最后一个值。有人能帮我吗?
谢谢 当E=np.zero(3)
在循环之前时,您只创建一个数组,并将其添加到列表中4次。当您更改值时,您正在更改相同的数组,当您查看
B
时,您有相同的数组4次,因为它是相同的对象。
当您将
E=np.zero(3)
放入for
的中时,您每次都在创建一个新数组,因此您会附加不同的数组,并且当您更改一个数组的值时,它们不会改变另一个数组。
您可以将最后一行更改为B.append(np.copy(E))
并创建E
的副本,从而将不同的数组追加到列表中。因为您在列表中添加了引用而不是E的副本,因此更改E也会更改B的内容。请选中以添加副本。为了安全起见,请使用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
[阵列([13.16046629,13.07833955,11.39445043]),阵列([11.70113908,11.59176892,12.9708855]),阵列
([12.85908412,12.8424841,12.62336043]),数组([12.23842107,13.02196394,12.54768361])基本上,对同一数组有四个引用附加到B中,您总是在更新单个内存单元,因此所有四个引用都以相同的值结束
为了提高效率,我建议简单地实例化整个矩阵,而不是单独使用append和adding行。您正在修改对E
变量的引用,因此所有条目的结果都是相同的数组。不需要复制emtpyE
数组的另一种解决方法是定义一个函数,该函数输出要附加到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())
您的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)
行E[j]=E1
在适当的位置修改E
,因此最终会多次追加同一数组。