【Python】numpy 中的 copy 问题详解

这篇文章本是我在 segmentfault 上的一个回答,但是越来越觉得有必要单独拿出来,毕竟这个问题挺常见的。具体可参看 numpy 官方文档


正文

numpy关于copy有三种情况,完全不复制视图(view或者叫浅复制(shallow copy)和深复制deep copy)。

b = a[:] 这种形式就属于第二种,即视图,这本质上是一种切片操作(slicing),所有的切片操作返回的都是视图。具体来说,b = a[:]会创建一个新的对象 b(所以 id(b)id(a) 返回的结果是不一样的),但是 b 的数据完全来自于a,和 a 保持完全一致,换句话说,b的数据完全由a保管,他们两个的数据变化是一致的,可以看下面的示例:

a = np.arange(4)  # array([0, 1, 2, 3])
b = a[:]  # array([0, 1, 2, 3])

b.flags.owndata  # 返回 False,b 并不保管数据
a.flags.owndata  # 返回 True,数据由 a 保管

# 改变 a 同时也影响到 b
a[-1] = 10  # array([0, 1, 2, 10])
b  #  array([0, 1, 2, 10])

# 改变 b 同时也影响到 a
b[0] = 10  # array([10, 1, 2, 10])
a  # array([10, 1, 2, 10])

b = ab = a[:] 的差别就在于后者会创建新的对象,前者不会。两种方式都会导致 ab 的数据相互影响。

要想不让 a 的改动影响到 b,可以使用深复制:

unique_b = a.copy()

END

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
NumpyPython用于科学计算的基础库之一,它提供了高效的多维数组对象,以及用于处理这些数组的工具。下面是一些常用的Numpy用法: 1. 导入Numpy库 ```python import numpy as np ``` 2. 创建Numpy数组 可以通过`np.array()`函数来创建一个Numpy数组。 ```python a = np.array([1, 2, 3]) # 一维数组 b = np.array([[1, 2, 3], [4, 5, 6]]) # 二维数组 ``` 也可以通过`np.zeros()`或`np.ones()`函数创建一个全0或全1的数组。 ```python c = np.zeros((2, 3)) # 2行3列的全0数组 d = np.ones((3, 4)) # 3行4列的全1数组 ``` 3. Numpy数组的属性 可以通过以下属性获取Numpy数组的信息: ```python print(a.shape) # 输出(3,),表示一维数组,长度为3 print(b.shape) # 输出(2, 3),表示二维数组,2行3列 print(c.shape) # 输出(2, 3),表示二维数组,2行3列 print(d.shape) # 输出(3, 4),表示二维数组,3行4列 print(a.ndim) # 输出1,表示一维数组 print(b.ndim) # 输出2,表示二维数组 print(c.ndim) # 输出2,表示二维数组 print(d.ndim) # 输出2,表示二维数组 ``` 4. Numpy数组的切片和索引 可以使用切片语法和索引语法来获取Numpy数组的部分内容。 ```python a = np.array([1, 2, 3, 4, 5]) print(a[1:3]) # 输出[2, 3],表示获取a数组下标为1和下标为2的元素 print(a[2:]) # 输出[3, 4, 5],表示获取a数组下标为2及其后面的所有元素 print(a[:3]) # 输出[1, 2, 3],表示获取a数组前三个元素 print(a[-2:]) # 输出[4, 5],表示获取a数组倒数两个元素及其后面的所有元素 b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(b[1:]) # 输出[[4, 5, 6], [7, 8, 9]],表示获取b数组第2行及其后面的所有行 print(b[:, 1:]) # 输出[[2, 3], [5, 6], [8, 9]],表示获取b数组每行的第2个元素及其后面的所有元素 ``` 5. Numpy数组的运算 Numpy数组支持各种数学运算,比如加、减、乘、除等。 ```python a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(a + b) # 输出[5, 7, 9],表示对应元素相加 print(a - b) # 输出[-3, -3, -3],表示对应元素相减 print(a * b) # 输出[4, 10, 18],表示对应元素相乘 print(a / b) # 输出[0.25, 0.4, 0.5],表示对应元素相除 ``` 6. Numpy数组的广播 Numpy数组支持广播,即在进行运算时,两个数组的形状不同时,会自动将小的数组复制成大的数组的形状。 ```python a = np.array([1, 2, 3]) b = 2 print(a + b) # 输出[3, 4, 5],表示将b复制成[2, 2, 2],然后与a数组相加 ``` 以上是Numpy的一些基本用法,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

secsilm

来一根火腿?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值