机器学习基础 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

Numpy数组的复制

对于数组的复制,新手可能会产生疑惑,有时会复制出一个新的数组,但有时不会,比如:

数组引用

引用数组并不会创建一个新的数组,新数组和源数组其实是一个对象

import numpy as np
a = np.arange(12)
b = a           #数组只是引用,并未复制
print(b is a)    #True,因为这2个数组相同
b.shape = 3,4   #同样改变了a的形状
print(a.shape)    #(3, 4)
a[0,0]=123        #同样改变了b[0,0]
print(b[0,0])    #123

数组浅复制

浅复制会创建一个新的数组对象,新的数组对象有独立的形状等属性,但和源数组共享数据。浅复制数组用view函数。

c = a.view()
print(c is a)    #False,c和a不是一个对象
print(c.base is a)    #True,c的数据是a的
print(c.flags.owndata)    #False,c没有独立的数据
c.shape = 2,6    #改变c的形状并不影响a的形状
print(a.shape)    #(3,4)
c[0,4] = 1234    #改变c的元素值会导致a的元素值改变
print(a)
'''
array([[   0,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])
'''

数组深复制

深复制会创建一个新的数组对象,新的数组对象有独立的属性和数据。深复制数组用copy函数。

d = a.copy()                         
print(d is a)    #False
print(d.base is a)    #d的数据是独立的
d[0,0] = 9999    #改变d的数据不影响a的数据
print(a)
'''
array([[   0,   10,   10,    3],
       [1234,   10,   10,    7],
       [   8,   10,   10,   11]])
'''
示例代码:Numpy-array-copy.py