Bootstrap

python之numpy (5 分割和复制)

分割

分割指将矩阵分割为几个小部分,以便于后续的计算需要。

split

import numpy as np
m=np.random.random((3,3))
print(m) 
sp=np.split(m,3,axis=0)
ssp=np.split(m,3,axis=1)
print(sp,ssp,sep='\n')
[[0.37324751 0.93319494 0.18961048]
 [0.81433081 0.37722575 0.00708714]
 [0.91463482 0.63293916 0.37207095]]
[array([[0.37324751, 0.93319494, 0.18961048]]), array([[0.81433081, 0.37722575, 0.00708714]]), array([[0.91463482, 0.63293916, 0.37207095]])]
[array([[0.37324751],
       [0.81433081],
       [0.91463482]]), array([[0.93319494],
       [0.37722575],
       [0.63293916]]), array([[0.18961048],
       [0.00708714],
       [0.37207095]])]
请按任意键继续. . .

使用split时,要指定axis参数,当axis=1时,表示横向即每一横行分割成三部分;当axis=0时,表示列行,即每一纵行分割成三部分。除此之外,还有vsplit和hsplit函数也可达到此功能。

vsplit和hsplit

import numpy as np
m=np.random.random((3,3))
print(m) 
vsp=np.vsplit(m,3)
hsp=np.hsplit(m,3)
print(vsp,hsp,sep='\n')
[[0.9873962  0.2239429  0.41554062]
 [0.08370767 0.07352826 0.00597415]
 [0.15575024 0.12947366 0.51808192]]
[array([[0.9873962 , 0.2239429 , 0.41554062]]), array([[0.08370767, 0.07352826, 0.00597415]]), array([[0.15575024, 0.12947366, 0.51808192]])]
[array([[0.9873962 ],
       [0.08370767],
       [0.15575024]]), array([[0.2239429 ],
       [0.07352826],
       [0.12947366]]), array([[0.41554062],
       [0.00597415],
       [0.51808192]])]
请按任意键继续. . .

同理,vsplit表示纵向分割成三部分(每一纵行分割成三部分),即分割结果为三行;而hsplit即横向分割成三部分(每一横行分割成三部分),即分割结果为三列。

注:对于axis=0或1是对应行还是列,仁者见仁智者见智,每种理解都有所不同,只要大家能够对应相应的结果即可。

此种分割方法均为平均分割,不能不等分割,而array_split可实现不等分割。

array_split

import numpy as np
m=np.random.random((3,3))
print(m) 
sp1=np.array_split(m,2,axis=0)
sp2=np.array_split(m,2,axis=1)
print(sp1,sp2,sep='\n')
[[0.05494222 0.34537749 0.701553  ]
 [0.89039863 0.56461006 0.93649615]
 [0.60022758 0.37980877 0.18820387]]
[array([[0.05494222, 0.34537749, 0.701553  ],
       [0.89039863, 0.56461006, 0.93649615]]), array([[0.60022758, 0.37980877, 0.18820387]])]
[array([[0.05494222, 0.34537749],
       [0.89039863, 0.56461006],
       [0.60022758, 0.37980877]]), array([[0.701553  ],
       [0.93649615],
       [0.18820387]])]
请按任意键继续. . .

原矩阵为3×3矩阵,而要被分割为两个矩阵,只能是不等分割。

复制

在 Python 中,copy方法用于创建对象的副本,特别适用于那些可变对象,如列表、字典和集合等。这个方法有助于避免对原对象的修改影响到副本,或者在需要操作对象的副本而不是原始对象时。

copy(浅copy,shallow copy)

original_list = [1, 2, 3]
copied_list = original_list.copy()
print(copied_list)
print(copied_list is original_list)
[1, 2, 3]
False
请按任意键继续. . .

....is.... 可以检验两者是否为同一对象,即两者地址是否相同。

在此例子中,copy后的copied_list和original_list内容相同但并非同一个对象。

copy.deepcopy(深拷贝)

  • 浅拷贝:仅复制对象本身及其直接引用的对象,不复制引用对象所指向的内存区域。例如,list.copy()创建的副本只复制了列表的外层结构,列表中的元素对象仍然是相同的。
  • 深拷贝:创建对象及其所有引用对象的完整副本。对于包含嵌套对象的情况,深拷贝会递归地复制所有层次的对象。
import copy
original_list = [1, [2, 3]]
copied_list =original_list.copy()
copied_list1=copy.deepcopy(original_list)
print(copied_list)
print(copied_list is original_list)
print(id(copied_list[1])==id(original_list[1]))
print(id(copied_list[1])==id(copied_list1[1]))
[1, [2, 3]]
False
True
False
请按任意键继续. . .

深拷贝不仅原列表和现列表地址不一样,而且原列表和现列表中不可变对象的地址也不同。

;