python – numpy数组赋值问题

我在Python 2.6.5与Numpy有一个奇怪的问题。我分配一个numpy数组,然后等同一个新的变量。当我对新数组执行任何操作时,原始值也会发生变化。这是为什么?请看下面的例子。请教我,因为我对Python很新,而且编程一般。

-Sujan

>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = a
>>> b
array([[1, 2],
       [3, 4]])
>>> c = a
>>> c
array([[1, 2],
       [3, 4]])
>>> c[:,1] = c[:,1] + 5
>>> c

array([[1, 7],
       [3, 9]])
>>> b
array([[1, 7],
       [3, 9]])
>>> a
array([[1, 7],
       [3, 9]])
这其实根本不是问题;它是数组(和其他对象)在Python中工作的方式。

想像这样:您在代码示例中创建的数组是位于内存中某个位置的对象。但是你不能在程序中使用它来告诉Python在内存中去寻找它;你必须给它一个名字。当你写的时候

a = np.array([[1,2],[3,4]])

您正在创建数组并创建引用它的名称a。从那时起,Python知道a指的是“内存地址0x123674283”(或任何)。 Python运行时中有一个内部表(如果我记得正确,称为“符号表”),因为在上述代码行运行之后,该表将包含

...,
'a' : 0x123674283,
...

当您将一个变量的值分配给另一个变量时

b = a

Python不会复制整个数组,因为如果它是一个大数组,那将需要很长时间。相反,它转到符号表,并将a的内存地址复制到表b中的新行。所以你结束了

...,
'a' : 0x123674283,
...,
'b' : 0x123674283,
...

所以你看到,a和b实际上是指内存中相同的位置,即同一个对象。对一个人的任何改变都会反映在另一个中,因为它们只是同一个东西的两个名字。

如果要实际制作数组的副本,则必须调用一个明确的方法。 Numpy数组有一个复制方法,您可以仅为此目的使用。所以如果你写的

b = a.copy()

那么Python将首先实际创建一个数组的副本 – 也就是说,它放置一个新的内存区域,我们假设地址为0x123904381​​,然后转到内存地址0x123674283,并从内存的后面部分复制数组的所有值到前者。所以你有相同的内容坐在两个不同的地方记忆。

...,
'a' : 0x123674283,
...,
'b' : 0x123904381,
...

现在,当您更改b的元素之一时,该更改将不会显示在a中,因为a和b不再引用计算机内存的相同部分。由于阵列数据有两个独立的副本,您可以更改一个而不影响另一个。

http://stackoverflow.com/questions/3059395/numpy-array-assignment-problem

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:python – numpy数组赋值问题