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数组。