Python分配变量

时间:2015-09-23 14:26:25

标签: python numpy

我有一个向量x(一个numpy数组),我想创建两个这样的副本;一个(y),其中偶数点设置为零,一个z,其中奇数点设置为零。我想出了两种可行的方法。

1)

x = numpy.array([1,2,3,4,5,6,7,8,9,10])
y = x
y[::2] = 0

结果

x
array([ 0,  2,  0,  4,  0,  6,  0,  8,  0, 10])

y
array([ 0,  2,  0,  4,  0,  6,  0,  8,  0, 10])

z = x
z[:,1::2] = 0

结果:

x
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
z
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

或者:

2)

y = numpy.zeros(10)
y[::2] = x[::2]

结果:

y
array([ 1.,  0.,  3.,  0.,  5.,  0.,  7.,  0.,  9.,  0.])
x
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

z = numpy.zeros(10)
z[1::2] = x[1::2]

结果:

z
array([  0.,   2.,   0.,   4.,   0.,   6.,   0.,   8.,   0.,  10.])
x
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

第一种方法似乎将x与y和z耦合,因此对y或z的任何更改也会影响x。第二种似乎是一种不太直观的写作方式,但给出了预期的结果。为什么这两种方法会产生不同的结果?第一个特别是在跟踪代码中发生的事情方面似乎相当危险!

2 个答案:

答案 0 :(得分:2)

当你将x分配给y时,你没有复制数组,而只是将变量指向对象x。

如果您签入代码,则以下内容应评估为true。

x is y

您还可以查看对象的唯一ID。它应该匹配。

id(x) == id(y)

您可以在numpy中使用复制功能来避免这些问题。

numpy copy documentation

答案 1 :(得分:1)

在Python中,y = x只会使y指向与x相同的对象。因此,对y的更改也会影响xy[::2] = 0更改yx

z = numpy.zeros(10)

z是一个全新的对象,与x没有任何关联。

z[1::2] = x[1::2]

将值从x复制到z,更改z,但不对x执行任何操作。

z = x.copy()还会制作x数据的独立副本。

到目前为止,我所写的内容适用于其他Python对象,例如列表和词典。但是np.arrays还有一个复杂的问题,即视图和副本之间的区别。

z = x[1::2]是一个观点。对z的进一步更改将影响xz=x[[1,3,5,7,9]]是副本。对z的更改不会影响x

这是numpy的基本部分,尤其是索引编制,因此我建议您更详细地研究文档。