【问题标题】:array assignment using slicing使用切片的数组赋值
【发布时间】:2016-10-19 10:07:45
【问题描述】:

当我使用切片进行数组赋值时,发生了一些奇怪的事情。源码如下:

import numpy as np
a = np.array([1,2,3,4]).reshape(2,2)
b = np.array([5,6,7,8]).reshape(2,2)
print(id(a))
print(id(b))
b = a[:]
b[1,1] = 10
print(b is a)
print(id(a))
print(id(b))
print(a)
print(b)

结果如下:

从结果来看,baid在数组赋值后是不同的,但是当我改变的值时ba中的值也发生了变化。这是为什么呢?

使用 Sublime Text,Python 3.4.3。

【问题讨论】:

  • 那个链接是关于列表的。这个问题是关于numpy数组的。
  • a[:] 使view 不是副本。
  • @hpaulj 谢谢。你说的对。 Numpy 数组与列表不同。
  • 我删除了 duplicates 因为这是关于数组视图 v 副本,而不是关于列表副本和深度副本。 stackoverflow.com/questions/2612802/…numpy 数组不是列表

标签: python arrays numpy


【解决方案1】:

对于列表,b=a[:] 会复制 a。对b 的更改不会影响a 或其值。

但是对于 numpy 数组,此操作会生成 viewb 是一个新对象,但它共享底层数据缓冲区。更改 b 中的值将影响 a

使用b=b.copy() 是您想要的真实副本。

https://docs.scipy.org/doc/numpy-dev/user/quickstart.html#copies-and-views

【讨论】:

【解决方案2】:

我认为您可能对引用 (b=a[:]) 有疑问。这是以前的答案,可能会有所帮助:

Python objects confusion: a=b, modify b and a changes!

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 2018-05-23
    • 2021-01-15
    • 1970-01-01
    • 2021-10-28
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多