我有一个向量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。第二种似乎是一种不太直观的写作方式,但给出了预期的结果。为什么这两种方法会产生不同的结果?第一个特别是在跟踪代码中发生的事情方面似乎相当危险!
答案 0 :(得分:2)
当你将x分配给y时,你没有复制数组,而只是将变量指向对象x。
如果您签入代码,则以下内容应评估为true。
x is y
您还可以查看对象的唯一ID。它应该匹配。
id(x) == id(y)
您可以在numpy中使用复制功能来避免这些问题。
答案 1 :(得分:1)
在Python中,y = x
只会使y
指向与x
相同的对象。因此,对y
的更改也会影响x
。 y[::2] = 0
更改y
,x
。
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
的进一步更改将影响x
。 z=x[[1,3,5,7,9]]
是副本。对z
的更改不会影响x
。
这是numpy
的基本部分,尤其是索引编制,因此我建议您更详细地研究文档。