【问题标题】:Numpy arrays and identity operator isNumpy 数组和身份运算符是
【发布时间】:2021-03-23 22:45:36
【问题描述】:

有一个像 x 这样的 numpy 数组和一个包含所有元素作为 z 的切片,为什么恒等运算符给出 false,尽管改变 z 中任何元素的值会反映在 x 上,反之亦然

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

z = x[:]

x is z 

# Output:
False

【问题讨论】:

  • id(x) != id(z) x 是一个数组,z 是该数组的一个切片 ...
  • 希望对您有所帮助。这是一个链接 stackoverflow.com/questions/4081561/…>
  • @Himanshu 不,这根本不是一回事。请参阅下面的评论。

标签: python numpy numpy-slicing identity-operator


【解决方案1】:

来自Numpy Internals

NumPy 数组由两个主要部分组成,原始数组数据(从现在开始,称为数据缓冲区)和有关原始数组数据的信息。

在切片z = x[:] 的情况下,它是一个视图,NumPy 存储描述如何解释数据缓冲区中不同内存位置的数据的重要数据集,但它可以共享来自z 的元素,因此两者都有不同的id,因此False

>>> x = np.array([1, 2, 3, 4, 5])
>>> z = x[:] # same as x.view()
>>> x[2]
3
>>> x[2] = 1
>>> x
array([1, 2, 1, 4, 5])
>>> z
array([1, 2, 1, 4, 5])
>>> x is z
False

如果你修改xz也会被修改。 更多参考Numpy Documentation

【讨论】:

  • 不,z 不是x 的副本,它是x 的视图。没有进行复制。
  • 通过复制,我的意思是它与x具有相同的元素/值(由于:
  • 重要提示...开个玩笑
  • 你还是错了。 Numpy 与 Python 列表不同。只有一个数组 - xz 是该数组的 sliceview。这就像透过窗户看一个物体。在不同的内存位置创建相同的元素称为复制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 2021-05-11
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多