为什么 NumPy: np.fill_diagonal() 会改变所有相关变量的对角线值?
Why NumPy: np.fill_diagonal() changes the diagnoal values of all related variables?
各位有经验的朋友,我在尝试使用np.fill_diagonal()
的时候遇到了一个问题。首先,我从原始 NumPy 数组设置了两个子变量。然后我使用 np.fill_diagonal()
更改其中一个变量的对角线值。但是,我发现所有变量的对角线值都已更改。
请问这是为什么?所有相关的 NumPy 变量是否共享相同的内存?我怎么知道他们确切的记忆关系?谢谢!
这是简单的代码:
# we set the original one
a = np.array([[ 10., 1., 1., 1., 1.],
[2., 20., 140., 8., 57.],
[3., 3., 30., 21., 51.],
[4., 4., 21., 40., 56.],
[5., 5., 31., 16., 50.]])
# the two sub-variables
b1 = a[:5,:5]
b2 = a[:5,:5]
# then I change the diagonal value of one of the sub-variables
np.fill_diagonal(b1, 0)
我们应该只改变b1
的值,但实际上a
、b1
和b2
都被改变了。请问如何只改变b1
的对角线值而不影响其他?谢谢!
a
array([[ 0., 1., 1., 1., 1.],
[ 2., 0., 140., 8., 57.],
[ 3., 3., 0., 21., 51.],
[ 4., 4., 21., 0., 56.],
[ 5., 5., 31., 16., 0.]])
b2
array([[ 0., 1., 1., 1., 1.],
[ 2., 0., 140., 8., 57.],
[ 3., 3., 0., 21., 51.],
[ 4., 4., 21., 0., 56.],
[ 5., 5., 31., 16., 0.]])
看起来 b1 和 b2 只是对 a 的引用。尝试使用 numpy.copy() 然后执行拼接以获得“深拷贝”,以便 b1 和 b2 在内存中有自己的空间。查看 Numpy API documentation 中的 numpy.copy。
各位有经验的朋友,我在尝试使用np.fill_diagonal()
的时候遇到了一个问题。首先,我从原始 NumPy 数组设置了两个子变量。然后我使用 np.fill_diagonal()
更改其中一个变量的对角线值。但是,我发现所有变量的对角线值都已更改。
请问这是为什么?所有相关的 NumPy 变量是否共享相同的内存?我怎么知道他们确切的记忆关系?谢谢!
这是简单的代码:
# we set the original one
a = np.array([[ 10., 1., 1., 1., 1.],
[2., 20., 140., 8., 57.],
[3., 3., 30., 21., 51.],
[4., 4., 21., 40., 56.],
[5., 5., 31., 16., 50.]])
# the two sub-variables
b1 = a[:5,:5]
b2 = a[:5,:5]
# then I change the diagonal value of one of the sub-variables
np.fill_diagonal(b1, 0)
我们应该只改变b1
的值,但实际上a
、b1
和b2
都被改变了。请问如何只改变b1
的对角线值而不影响其他?谢谢!
a
array([[ 0., 1., 1., 1., 1.],
[ 2., 0., 140., 8., 57.],
[ 3., 3., 0., 21., 51.],
[ 4., 4., 21., 0., 56.],
[ 5., 5., 31., 16., 0.]])
b2
array([[ 0., 1., 1., 1., 1.],
[ 2., 0., 140., 8., 57.],
[ 3., 3., 0., 21., 51.],
[ 4., 4., 21., 0., 56.],
[ 5., 5., 31., 16., 0.]])
看起来 b1 和 b2 只是对 a 的引用。尝试使用 numpy.copy() 然后执行拼接以获得“深拷贝”,以便 b1 和 b2 在内存中有自己的空间。查看 Numpy API documentation 中的 numpy.copy。