gpt4 book ai didi

python - NumPy 中明显不一致的引用行为

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:18 25 4
gpt4 key购买 nike

当从二维 numpy 数组中的另一行引用给定行时,我注意到在我看来是意外行为

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

执行此操作后,a 将等于:

array([[  1,   2], [101, 102]])

我不明白为什么不考虑对a[0] 的引用而只修改a[1]。特别是因为对于 Python 列表,情况并非如此:

a = [[1,2], [3,4]]
a[1] = a[0]
a[1][1] = 999

这将给出 a:

[[1, 999], [1, 999]]

最佳答案

任何非object dtype 的 NumPy 数组不包含引用。因此,当您设置 a[1] = a[0] 时,它只是将 a[0] 的内容复制到 a[1] 中。这意味着对 a[1]a[0] 的任何后续赋值都不会更改另一个。

另一方面,当您有 a[1] = a[0] 时,列表不会复制,它只是插入对 a[0] 的引用a[1]。这意味着对 a[1]a[0] 的赋值也会更改另一个。

要点可能是:不要将 NumPy 数组视为包含引用。即使是多维的,它实际上也不是嵌套的“数组”。它始终是一个一维数组,使用“步幅”来“呈现多维”。


这里可能有助于比较“身份”。这有点复杂,因为 NumPy 不使用引用,而是使用内存缓冲区。但是 NumPy 提供了检查共享内存的函数:

>>> import numpy as np
>>> a = np.array([[1,2], [3, 4]])
>>> a[1] = a[0]
>>> np.shares_memory(a[1], a[0]) # the arrays don't share memory
False

>>> a = [[1,2], [3,4]]
>>> a[1] = a[0]
>>> a[1] is a[0] # they are the same object
True

请注意,如果您只是“查看”NumPy 数组而不将其分配给数组,则情况会有所不同。对 NumPy 数组的赋值就是复制。那是因为,就像我说的,NumPy 数组不存储引用,它只存储元素。因此,您可以在数组中创建一个 View ,但不能将 View 作为 View 插入到 NumPy 数组中。

例如:

>>> a = np.array([[1,2], [3, 4]])
>>> b = a[0] # b is now a view into "a"
>>> np.shares_memory(b, a[0])
True

>>> a[1] = b
>>> np.shares_memory(b, a[1]) # a[1] is not a view into "a[0]".
False

关于python - NumPy 中明显不一致的引用行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46146015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com