最后一列追加python

时间:2018-12-18 20:54:11

标签: 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.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的最后一个值。谁能帮我 ? 谢谢!

5 个答案:

答案 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)