python np数组更改for循环中的元素值

时间:2016-11-08 16:42:12

标签: python arrays copy

我对np 2D数组中的元素值更改有疑问。我在这里有一个例子:

a=np.arange(10).reshape(2,5)
for i in a: # go through the rows of array
    i=np.array([0,0,0,0,0])

print a

返回值为

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

表示原始数组没有变化。这是否意味着for循环中的i是数组a的每一行的副本?如果我是副本,那么它是有道理的,因为副本的更改不会影响原始值。但我尝试以下代码:

a=np.arange(10).reshape(2,5)
for i in a: # go through the rows of array
    i[:]=np.array([0,0,0,0,0])

print a

返回结果是

array([[0, 0, 0, 0, 0],
      0, 0, 0, 0, 0]])

所以我不明白为什么我[:]可以在这里工作,如果我是副本。如果这个问题重复,请提供链接吗? 感谢。

1 个答案:

答案 0 :(得分:0)

i不是副本。请记住,for循环会从iterable中的项目到目标列表(in的左侧)进行重复分配。因此,在每次迭代中,i都会在a中保存对每个子数组的引用。

下面:

for i in a: 
    i = np.array([0,0,0,0,0])

您将a中的每个子数组分配给名称i,然后立即将名称分配给完全不相关的对象。在该循环中尝试i = 'unrelated',并注意除了将a分配给新的字符串对象之外没有任何效果(我的意思是i)。

第二种情况将a中的子数组连续分配给i(与第一种情况一样),但之后通过引用{{1}执行就地修改}。 更清楚的是,第二种情况的第一次迭代与:

相同
i

第二次迭代:

i = a[0]
i[:] = np.array([0,0,0,0,0])

另请注意,从第一次迭代到第二次迭代i = a[1] i[:] = np.array([0,0,0,0,0]) 的转换不会修改先前的引用i = a[1],而是将名称a[0]重新分配给新对象i