python编程经验

python编程的经验和易错细节总结

个人经验总结。

数据复制

  1. 直接赋值:相当于C++的引用,起别名

  2. 浅拷贝: 拷贝父对象,但是不会拷贝对象的内部的子对象。

  3. 深拷贝: 拷贝父对象. 以及其内部的子对象

以可变对象list为例,上述三种赋值的操作依次为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
a = [1, 2, [3, 4]]
b = a # 直接赋值
b[0] = 999
print(a)
print(b)
print(id(a)==id(b))
b = copy.copy(a) # 浅拷贝,等价于a.copy()
b[0] = 888
b[2][0] = 888
print(a)
print(b)
print(id(a)==id(b))
b = copy.deepcopy(a) # 深拷贝
b[0] = 777
b[2][0] = 777
print(a)
print(b)
print(id(a)==id(b))
'''
[999, 2, [3, 4]]
[999, 2, [3, 4]]
True
[999, 2, [888, 4]]
[888, 2, [888, 4]]
False
[999, 2, [888, 4]]
[777, 2, [777, 4]]
False
'''

numpy

复制

默认浅复制,使用.copy()进行深复制。

修改

resize() 就地操作,可以修改尺寸。

reshape() 非就地操作,只能修改形状。

入参都是一组数字或者元组。但前者入参不能有-1。

切片

当使用数组切片切下一维切片(单行或单列)时,默认为一维数组,需用reshape(-1, 1)转换为二维数组,才可使用np.hstack等函数或同二维数组进行运算。

可以直接对切片赋值,如对一维切片进行赋值,需要将赋值对象拉平reshape(-1)

还可以通过切片提升数组维度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# :等同于...
a = np.arange(1, 4)
print(a)
print(a[:, None])
print(a[None, ...])
print(a[None, :, None])
'''
[1 2 3]
[[1]
[2]
[3]]
[[1 2 3]]
[[[1]
[2]
[3]]]
'''

生成

np.meshgrid() 生成网格,输出为网格的横坐标矩阵和纵坐标矩阵。

1
2
3
4
5
6
7
8
9
x = np.array([0, 1, 2])
y = np.array([0, 1])
X, Y = np.meshgrid(x, y)
'''
[[0 1 2]
[0 1 2]]
[[0 0 0]
[1 1 1]]
'''

可视化

matplotlib

常用例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import matplotlib.pyplot as plt

# 设置图像大小,像素为figsize*dpi
fig = plt.figure(figsize=(30, 10), dpi=50)
ax1 = fig.add_subplot(121)

X = np.arange(10)
Y = np.square(X)
ax1.set_xlabel('X')
ax1.set_ylabel('Y')
ax1.plot(X, Y,
color='grey',
marker='o',
markersize=8,
linewidth=2,
markerfacecolor='red',
markeredgecolor='grey',
markeredgewidth=2)

XX, YY = np.meshgrid(X, Y)
Z = np.full_like(XX, 0)
for i in range(X.size):
for j in range(Y.size):
# 注意这里Z的shape是(Y.size,X.size)
Z[j][i] = X[i] + Y[j]

ax2 = fig.add_subplot(122, projection='3d')
ax2.plot_surface(XX, YY, Z, cmap='rainbow')
ax2.set_xlabel('X')
ax2.set_ylabel('Y')
ax2.set_zlabel('Z')
# visible:表示是否显示网格。若提供其他关键字参数,则b参数设为True。
# which:表示显示网格的类型,支持major、minor、both这3种类型,默认为major。
# axis:表示显示哪个方向的网格,该参数支持both、x和y这3个选项,默认为both。
# linewidth或lw:表示网格线的宽度。
# ax1.grid(visible=True,which='both', axis='both', linewidth=0.3)
# 在show之前调用
plt.savefig('loss_image.jpg')
plt.show()
plt.close()
可视化结果

解包操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def add(a, b):
return a + b

d1 = [1, 2]
d2 = {'a':3, 'b':4}

print(add(*d1))
print(add(*d2))
print(add(**d2)) # key与形参名需对应
'''
3
ab
7
'''

python编程经验
https://reddish.fun/posts/Article/python-experience/
作者
bit704
发布于
2023年1月3日
许可协议