分割
分割指将矩阵分割为几个小部分,以便于后续的计算需要。
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
请按任意键继续. . .
深拷贝不仅原列表和现列表地址不一样,而且原列表和现列表中不可变对象的地址也不同。