我有一个下面给出的代码。当我运行代码时,所有x1,x2和x3具有相同的值。按逻辑x1应该有随机数,x2也是随机数,x3应该有0和1。
import numpy as np
def reluDerivative(x):
yy=x;
yy[yy<=0] = 0
yy[yy>0] = 1
return yy
x1=np.random.uniform(-1, 1,10)
x2=x1
x3=reluDerivative(x1)
答案 0 :(得分:1)
您应该将python变量视为标签,因此当您执行x2=x1
时,您只是为内存中的相同数据创建新标签,这在可变和不可变的行为上有所不同对象,例如:
x1 = []
x2 = x1
x2.append(10)
print(x2)
print(x1)
将导致打印:
[10]
[10]
因为x2
和x1
都标记了相同的列表。对于不可变对象,这是可变对象的行为:
x1 = 10
x2 = x1
x2 += 5
print(x2)
print(x1)
将打印:
15
10
因为在这种情况下,由于x2
操作,15
被重新分配以标记新创建的+
。
解决方案就是复制原始对象(对于你的numpy对象)的数据:
x2 = np.copy(x1)
答案 1 :(得分:0)
您只需给同一个列表x1
另一个名称:x2
该bot指向相同的数据。修改一个正在修改另一个指向的数据。
你需要(浅)复制:
import numpy as np
def reluDerivative(yy):
return [0 if x <=0 else 1 for x in yy ]
x1 = np.random.uniform(-1, 1,10)
x2 = x1.copy() # copy of x1, no longer same data
x1[0] = 2 # proves decoupling of x1 and x2
x3 = reluDerivative(x2)
print(x1, x2, x3)
输出:
[2. 0.84077008 -0.30286357 -0.26964574 0.3979045 -0.8478326
-0.4056378 0.16776436 0.55790904 0.3550891 ]
[-0.00736343 0.84077008 -0.30286357 -0.26964574 0.3979045 -0.8478326
-0.4056378 0.16776436 0.55790904 0.3550891 ]
[0, 1, 0, 0, 1, 0, 0, 1, 1, 1]