最后一列附加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
变量的引用,因此所有条目的结果都是相同的数组。不需要复制emtpy
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())
您的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
,因此最终会多次追加同一数组。