我对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]])
所以我不明白为什么我[:]可以在这里工作,如果我是副本。如果这个问题重复,请提供链接吗? 感谢。
答案 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