Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数组a=数组b[:],但更改a也会更改b(numpy)_Python_Python 3.x_Numpy - Fatal编程技术网

Python 数组a=数组b[:],但更改a也会更改b(numpy)

Python 数组a=数组b[:],但更改a也会更改b(numpy),python,python-3.x,numpy,Python,Python 3.x,Numpy,很抱歉,这个问题以前在这里出现过 但是这个解决方案不起作用,我不知道为什么 import numpy as np zero_matrix = np.zeros((3,3)) # 3x3 zero matrix test_matrix = zero_matrix[:] # test_matrix is a view of zero_matrix. Without [:] it would be same object print (zero_matrix) print () print (te

很抱歉,这个问题以前在这里出现过 但是这个解决方案不起作用,我不知道为什么

import numpy as np

zero_matrix = np.zeros((3,3)) # 3x3 zero matrix

test_matrix = zero_matrix[:] # test_matrix is a view of zero_matrix. Without [:] it would be same object
print (zero_matrix)
print ()
print (test_matrix)
print ()
print(id(test_matrix))
print ()
print(id(zero_matrix))
print ()

test_matrix[1] = 42

print (test_matrix)
print ()
print (zero_matrix)
当我设置test_矩阵[1]=42时,“zero_矩阵”也会改变


我不明白为什么,因为两者都有不同的对象ID。

使用
copy
复制numpy数组:

zero_矩阵=np.zeros((3,3))
测试矩阵=零矩阵。复制()
测试矩阵[1]=42
打印(零矩阵)
打印(测试矩阵)

Numpy数组和python列表在这方面的行为不同。

它们确实有两个不同的对象ID,但是,正如您自己编写的:
test\u matrix
zero\u matrix
的视图

当一个对象提供了一种访问另一个对象(无论是通过读取还是通过写入)的方法时,它通常被称为“视图对象”。在这种情况下,通过读取和写入,对该视图对象的访问会转向另一个对象

这是numpy对象相对于“普通”python对象的一个特性


但是,即使python也有这些对象,但除非明确请求,否则不会使用它们。

这就是代码中的注释所指的意思,它说
test\u matrix
是一个“视图”。视图没有自己的数据副本。而是共享原始数组的底层数据。视图不必是整个阵列的视图,但可以是阵列的小部分。如果视图是跨视图的,这些子部分甚至不需要是连续的。例如

a = np.arange(10)
b = a[::2] # create a view of every other element starting with the 0-th
assert list(b) == [0, 2, 4, 6, 8]
assert a[4] == 4
b[2] = -1
assert a[4] == -1
视图功能强大,因为它们允许更复杂的操作,而无需复制大量数据。不需要一直复制数据可能意味着某些操作比其他操作要快

注意,并非所有索引操作都创建视图。例如

a = np.arange(10, 20)
b = a[[1,2,5]]
assert list(b) == [11, 12, 15]
b[0] == -1
assert a[1] != -1

该链接讨论的是列表,而不是numpy数组。