作为参数传递给函数的 numpy 数组和返回的数组是相同的
numpy array passed as argument to function, and returned array are the same
函数看起来像:
def mutate_color(tri):
out = tri.copy()
out[3][np.random.randint(3)] = np.random.randint(256)
return out
一个对象看起来像:
TRI_A = array([array([181, 75]), array([99, 9]), array([53, 15]),
array([18, 5, 19], dtype=uint8)], dtype=object)
<==这是一个彩色三角形,前三个是坐标,最后一个是RGB值。
但是当我将这个(或类似的对象传递给这个函数)时:
例如:
TRI_B = mutate_color(TRI_A)
我注意到 TRI-B 和 TRI_A 都被修改了,我的意思是我使用 .copy() 函数,不应该 TRI_A 保持与原始版本相同,只有 B 会是修改了吗?
请帮忙。
TRI_A
的数据类型是object
,所以实际存储在数组中的值是指向各种对象(在本例中是几个不同的numpy数组)的指针。当 copy()
方法创建一个新的 object
数组时,它只复制指针。它不会递归复制 numpy 数组指向的所有 Python 对象。
这在 numpy.copy
的文档字符串中有进一步解释。特别是,
Note that np.copy is a shallow copy and will not copy object
elements within arrays. This is mainly important for arrays
containing Python objects. The new array will contain the
same object which may lead to surprises if that object can
be modified (is mutable):
>>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
>>> b = np.copy(a)
>>> b[2][0] = 10
>>> a
array([1, 'm', list([10, 3, 4])], dtype=object)
To ensure all elements within an ``object`` array are copied,
use `copy.deepcopy`:
>>> import copy
>>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
>>> c = copy.deepcopy(a)
>>> c[2][0] = 10
>>> c
array([1, 'm', list([10, 3, 4])], dtype=object)
>>> a
array([1, 'm', list([2, 3, 4])], dtype=object)
函数看起来像:
def mutate_color(tri):
out = tri.copy()
out[3][np.random.randint(3)] = np.random.randint(256)
return out
一个对象看起来像:
TRI_A = array([array([181, 75]), array([99, 9]), array([53, 15]),
array([18, 5, 19], dtype=uint8)], dtype=object)
<==这是一个彩色三角形,前三个是坐标,最后一个是RGB值。
但是当我将这个(或类似的对象传递给这个函数)时:
例如:
TRI_B = mutate_color(TRI_A)
我注意到 TRI-B 和 TRI_A 都被修改了,我的意思是我使用 .copy() 函数,不应该 TRI_A 保持与原始版本相同,只有 B 会是修改了吗?
请帮忙。
TRI_A
的数据类型是object
,所以实际存储在数组中的值是指向各种对象(在本例中是几个不同的numpy数组)的指针。当 copy()
方法创建一个新的 object
数组时,它只复制指针。它不会递归复制 numpy 数组指向的所有 Python 对象。
这在 numpy.copy
的文档字符串中有进一步解释。特别是,
Note that np.copy is a shallow copy and will not copy object
elements within arrays. This is mainly important for arrays
containing Python objects. The new array will contain the
same object which may lead to surprises if that object can
be modified (is mutable):
>>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
>>> b = np.copy(a)
>>> b[2][0] = 10
>>> a
array([1, 'm', list([10, 3, 4])], dtype=object)
To ensure all elements within an ``object`` array are copied,
use `copy.deepcopy`:
>>> import copy
>>> a = np.array([1, 'm', [2, 3, 4]], dtype=object)
>>> c = copy.deepcopy(a)
>>> c[2][0] = 10
>>> c
array([1, 'm', list([10, 3, 4])], dtype=object)
>>> a
array([1, 'm', list([2, 3, 4])], dtype=object)