np.copy()是深拷贝还是浅拷贝

最近在用numpy的拷贝操作,发现网上对np.copy()究竟是深拷贝还是浅拷贝说法不一致,因此记录一下。

总结:如果numpy array是一个简单的数组,np.copy()是深拷贝。如果numpy array内包含了对象,np.copy()是浅拷贝。
ps: arr.copy = np.copy(arr)

实验

1. 拷贝矩阵

原始矩阵m,分别用两种不同的方式拷贝。用np.copy()得到n, 用浅拷贝得到z

import numpy as np
m = np.array([[0,1,2],[1,2,3],[3,4,5]])
# numpy拷贝, 等同于n = np.copy(m)
n = m.copy()
# 浅拷贝
z = m

输出:

>>> m
array([[0, 1, 2],
       [1, 2, 3],
       [3, 4, 5]])
>>> n
array([[0, 1, 2],
       [1, 2, 3],
       [3, 4, 5]])
>>> z
array([[0, 1, 2],
       [1, 2, 3],
       [3, 4, 5]])

2. 修改m的值

m[0][0]=-1

修改m的值后,使用np.copy的n值没有改变,浅拷贝z的值发生了改变

>>> m
array([[-1,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> n
array([[0, 1, 2],
       [1, 2, 3],
       [3, 4, 5]])
>>> z
array([[-1,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])

3. 修改拷贝矩阵的值

修改n的值,mz值都没有改变

n[0][0]=-2

>>> m
array([[-1,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> n
array([[-2,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> z
array([[-1,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])

修改z的值,m值改变和n值不变

z[0][0]=-3

array([[-3,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> n
array([[-2,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> z
array([[-3,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])

因此np.copy从以上的例子来看是深拷贝, =是浅拷贝

官方文档

但是在 numpy官方文档中明确提到np.copy是浅拷贝。原因是如果array里的元素是一个对象时,如果对象的元素改变,原来的array的对象也会改变。也就是说numpy array中对象元素的拷贝是浅拷贝。

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)

参考文档

  1. 官方文档
  2. 博客1
  3. 博客2
<think&gt;好的,用户想知道如何将苹果手表S8与荣耀手机配对或连接。首先,我需要确认苹果手表和荣耀手机的兼容性。苹果手表主要设计用于与iPhone配合使用,因此可能无法与安卓手机完全兼容。不过,用户可能还是想尝试连接,或者寻找替代方法。 接下来,我应该检查是否有官方支持。苹果的官方网站明确指出,Apple Watch需要iPhone 6s或更高版本,并安装最新版本的iOS。这说明官方并不支持安卓设备,包括荣耀手机。需要告知用户这一点,避免他们尝试后发现无法连接。 不过,用户可能仍然想尝试一些第三方应用。例如,有一些应用如Wear OS by Google,但Apple Watch运行的是watchOS,与Wear OS不兼容。可能需要使用其他方法,比如通过蓝牙连接部分功能,但通知、应用同步等功能可能无法使用。 另外,用户可能需要了解即使能配对部分功能,也会有很多限制。比如,无法接收通知、无法使用App Store安装应用、健康数据同步可能受限等。这些都需要明确告知用户,让他们了解潜在的问题。 最后,可能需要建议替代方案,比如使用兼容安卓的智能手表,如华为或荣耀自家的产品,以获得更好的体验。同时,确保回答结构清晰,分步骤说明可能的尝试方法,但强调官方不支持,避免用户产生误解。</think&gt;### 苹果手表S8连接荣耀手机的方法及注意事项 #### 一、兼容性分析 1. **官方限制** Apple Watch S8基于watchOS系统开发,**仅支持与iPhone配对**(需iPhone 6s或更新机型,iOS 15及以上系统)[^1]。荣耀手机搭载安卓系统,**官方未提供适配方案**,因此无法通过常规蓝牙配对实现完整功能。 2. **功能局限性** 即使通过第三方工具实现基础连接,以下功能将受限或失效: - 消息通知同步 - 健康数据自动传输(如心率、睡眠监测) - App Store应用下载 - 系统级交互(如Siri、快捷指令) #### 二、尝试性连接步骤(非官方方案) 1. **基础蓝牙配对** - 打开荣耀手机蓝牙设置 → 开启Apple Watch蓝牙 - 双方设备可能识别为“未知设备”,但无法建立有效通信通道 2. **使用第三方工具(有限功能)** 可尝试通过以下应用实现部分数据传输: ```markdown 1. *Wear Link*(需Google Play服务) 2. *Watch Droid*(需Root权限) ``` &gt; 注意:这类工具仅支持基础计步显示,且存在稳定性风险 #### 三、替代方案建议 1. **跨平台智能手表推荐** | 品牌 | 型号 | 安卓兼容性 | 特色功能 | |------------|---------------|------------|------------------------| | 华为 | Watch GT 4 | 完全支持 | 鸿蒙系统、长续航 | | 荣耀 | GS 3 | 完全支持 | 100+运动模式 | | Garmin | Venu 3 | 完全支持 | 专业运动数据分析 | 2. **多设备协同方案** 若必须使用Apple Watch,可搭配二手iPhone作为中转设备: ```mermaid graph LR A[荣耀手机] --云端同步--&gt; B[iPhone备用机] B --蓝牙配对--&gt; C[Apple Watch] C --健康数据--&gt; B ``` #### 四、技术原理说明 Apple Watch采用**私有通信协议**,其蓝牙连接过程包含以下验证环节: $$ Authentication = \text{HMAC-SHA256}(DeviceKey \oplus PairingCode, Nonce) $$ 这种加密机制导致非Apple设备无法通过系统级验证,这也是安卓手机难以兼容的根本原因[^1]。 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值