视频链接
创建 array
操作:
# 列表索引
x = np.array([[1, 2], [3, 4], [5, 6]])
#[0,1,2]代表行索引;[0,1,0]代表列索引
y = x[[0,1,2],[0,1,0]]
>>> [1 4 5]
# np 索引
import numpy as np
b = np.array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9,10,11]])
r = np.array([[0,0],[3,3]]) #取两行,
c = np.array([[0,2],[0,2]]) #对应行按索引取两个
# 也可
#r = np.array([[0],[3]])
#c = np.array([[0,2]])
#获取四个角的元素
c = b[r,c]
print(c)
# print(b[[[0,0], [3,3]], [[0,2], [0,2]]]) #一样的
>>> [[ 0 2]
[ 9 11]]
## numpy 融合图片
from PIL import Image
import numpy as np
im = Image.open('test.jpg').resize((400,400))
#im.show()
im_arr = np.array(im)
# print(im_arr.shape) # (400, 400, 3) opencv也是,只是3里面的顺序不一样,在tensor里是要把3移到前面的
im2 = np.array(Image.open('test2.jpg').resize((400,400)))
im_blend=im_arr*0.4+im2*0.6
im_blend = im_blend.astype(np.uint8)
Image.fromarray(im_blend).show()
## 图片操作
from PIL import Image
import numpy as np
im = np.array(Image.open('test.jpg').resize((400,400)))
# im 高、宽
im_downsample = im[::3,::3,:]# 图片下采样
Image.fromarray(im_downsample).show()
im_flipped=im[::-1,:,:] # 图片上下翻转
Image.fromarray(im_flipped).show()
im_croped =im[150:250,150:250,:] # 图片裁剪
Image.fromarray(im_croped).show()
视频链接
官网
收集的精美画图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
### 一些基本设置
# 常用字体 https://blog.csdn.net/lemonbit/article/details/121433603
matplotlib.rcParams['font.family'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
# 设置图片清晰度(200dpi: 200像素每英寸)
matplotlib.rcParams['figure.dpi'] = 200
# 常用风格 plt.style.available
# https://blog.csdn.net/weixin_45920673/article/details/118438893
# https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html
plt.style.use('fast')
### 初始化数据
seasons = [1,2,3,4] # 季度
stock1 = [4,8,2,6] # 股票1每个季度对应的股价
stock2 = [10,12,5,3] # 股票2每个季度对应的股价
# 转化数据为Numpy数组(可跳过)
seasons = np.array(seasons)
stock1 = np.array(stock1)
stock2 = np.array(stock2)
# 画出两个股价的折现图
plt.plot(seasons, stock1, "ro--", label="股票代码: abc") # ro--不指定其中一个,就不画出来
plt.plot(seasons, stock2, "b^--", label="股票代码: def")
## 改进
plt.title("折线图")
plt.xlabel("季度")
plt.ylabel("平均股价")
# 添加图例
plt.legend()
# 设置x/y坐标刻度
plt.xticks([1, 2, 3, 4])
plt.yticks(np.arange(2, 13, 1))
# 图的某部分缩进
# plt.xlim(2.5, 4.5)
# plt.ylim(1.5, 6.5)
# 添加网格与辅助线
plt.grid()
# plt.savefig("images/pic1_1.png")
plt.show()
# matlab 语法
plt.figure(figsize=(9,3)) # 这个是英寸单位
plt.subplot(211)
plt.bar(seasons, stock1, "ro--")
plt.subplot(212)
plt.plot(seasons,stock2,"b^--")
plt.show()
# 面向对象OOP精确语法
fig,axes = plt.subplots(2,1,figsize=(6,6))
axes[0].bar(seasons, stock1)
axes[1].plot(seasons, stock2,"b^--")
plt.show()
# 画4个
# 面向对象(Object-oriented programming)精确语法
fig, axes = plt.subplots(2, 2, figsize=(6, 6),
facecolor="grey", # 画面背景改为灰色
sharex=True, sharey=True) # 共享xy轴坐标系
axes[0, 0].bar(seasons, stock1)
axes[0, 1].plot(seasons, stock2, "b^--")
ax = axes[1, 0]
ax.plot(seasons, stock2-stock1, "--", color="black") # 不同的点画在一张图上
ax.scatter(seasons, stock2-stock1,
s=[10, 20, 50, 100],
c=['r', 'b', 'c', 'y'])
ax.set_ylabel("差价(股票1-股票2)")
axes[0, 0].set_title("股票1")
axes[0, 1].set_title("股票2")
# 可以删除最后一个坐标系
axes[1, 1].remove()
axes[0, 0].plot(seasons, stock1, 'r+-')
fig.suptitle("股票分析图")
fig.supylabel("股价")
fig.supxlabel("季度")
# plt.savefig("images/pic2_5.png", facecolor=fig.get_facecolor()) # 注: 保存图片
plt.tight_layout() # 保持内容紧凑
plt.show()
with open('./test.txt',mode='wb') as f:
print('heool',file=f) # a bytes-like object is required, not 'str'
print(b'hell',file=f)
# 说明只能接收字节(不是字符)类的对象,而不是字符串
#file: a file-like object (stream); defaults to the current sys.stdout.
#说明标准输出也是文件
print("hello".encode('utf-8')) # b'hello'
with open('test.txt','rt') as f:
for i in f:
print(i,end='')
with open('test.txt','wt') as f:
for i in a:
f.write(i) # i只能是字符串
f.write('\n')
with open('test.txt','rt') as f:
lines = f.readlines()
for i in lines: # 读取的i也包含‘\n’
print(i.strip())
import os #(包括子目录里面的文件)
for root,dirs, files in os.walk(os.getcwd()):
print(root)
print(dirs)
print(files)
def cv_imread(filePath): #读取中文路径的图片
cv_img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),cv2.IMREAD_UNCHANGED)
#imdecode读取的图像默认会按BGR通道来排列图像矩阵,如果后续需要RGB可以通过如下转换
#cv_img=cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)
self.__class__.__name__
self.__class__ # 实例指向对应的类,__name__ 调用了其他的类属性(类名)
# __dict__属性:
# 类.__dict__ 查看对象内部所有属性名和属性值组成的字典(包括属性成员和方法成员)
#实例.__dict__ 返回实例的属性,没有类的属性
# dir(实例 or 类) # 实例和类的属性有不同的地方,比如,实例多了__class__
# 判断是否是Iterable
import collections
if isinstance(e, collections.Iterable):
# e is iterable
# 判断一个类是否是另一个类的子类
print(issubclass(ChiClass, ParClass))
>>>
True
# 判断一个对象是否是另一个类的实例
print(isinstance(x, ChiClass))
>>>
True
# 判断一个对象是否拥有指定的属性
print(hasattr(x, 'name'))
>>>
True
# 获取一个对象的指定属性,也能删除一个属性delattr()
print(getattr(x, 'name'))
>>>
jackko
# 设置一个对象的指定属性
print(getattr(x, 'name'))
print(setattr(x, 'name', 'anney')) # 没有返回值
print(getattr(x, 'name'))
>>>
jackko
None
anney
super()
内的特殊方法
__call__()
,对象名.()
sys.getrefcount(name) # 显示对象的引用次数
if {}:
>>> false
- 所有序列都支持的方法
i1 = l1.__iter__() # iter(l1) # 等价于
print(i1) # 返回一个迭代器对象,每次使用循环时,系统自动创建迭代器,来遍历每个元素
print(i1.__next__())
print(i1.__next__())
print(i1.__next__()) # 注意:迭代器不可逆,要想再迭代就要创建新的迭代器
>>>
<list_iterator object at 0x000001449EEA60B8>
1
2
3
import copy
l2 = copy.deepcopy(l1) 这种也是生成新对象
- print(l2)
l2[1:3] = [] # 把1、2设为空
print(l2)
print(l2[1])
>>>
[1, 32, 3, 'xyz', 5]
[1, 'xyz', 5]
xyz
print(l2)
l2[1:] = ['m', 'n', 'r'] # 1:是指从下标1到最后,包括最后
print(l2)
>>>
[1, 'xyz', 5]
[1, 'm', 'n', 'r']
print(id(l2))
print(l2)
del(l2[1:])
print(l2)
>>>
2507620552392
[1, 'm', 'n', 'r']
[1]
zip('xyz', '123') # 将序列一一对应组成元组,返回的是对象,节省内存。需要用list()来查看
print(list((zip('xyz', '123'))))
print(list((zip('xyzm', '123')))) # 只会一一对应,多的不要
print(list((zip('xyz', '1234'))))
>>>
[('x', '1'), ('y', '2'), ('z', '3')]
[('x', '1'), ('y', '2'), ('z', '3')]
[('x', '1'), ('y', '2'), ('z', '3')]
d4 = dict(zip('xyz', '123')) # 构建字典
print(d4)
>>>
{'x': '1', 'y': '2', 'z': '3'}
is 是判断引用对象的地址是否相同
num1 = 5
num2 = 5
print(num1 == num2) # 但未必证明是同一对象
>>> True
print(num1 is num2) # 这才是同一对象
>>> True
print(type(num1) is type(num2))
>>> True
print(id(num1) == id(num2))
>>> True
print(type(type(num))) # type也是一个类型
>>> <class 'type'>
print(type(str)) # str ,等以及自定义的class类型,都是type类型,因为没有实例化
>>> <class 'type'>
每个模块文件、类、函数开头都可以用" “或”“” “”“写文件描述,可以使用”.doc"来查看
print(str.__doc__)
模块(py文件)、类或函数的第一条语句是一个字符串的话,该字符串就成为文档字符串
可以使用__doc__属性引用
dir() 打印对象自带方法
id() 对象内存地址
help (dict.fromkeys)
str2 = "hello world"
l1 = list(str2)
print(l1)
>>> ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
str3 = str(l1) # 把整个列表当做一个串来用
print(str3)
>>> ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
print(type(str3))
>>> <class 'str'>
t1 = tuple(str2)
print(t1)
>>> ('h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd')
s1 = set(str2)
print(s1)
>>> {'e', 'h', 'l', 'o', 'd', 'w', 'r', ' '}
l3 = [('a', 1), ('b', 11), ('c', 45)]
d1 = dict(l3)
print(d1)
>>> {'a': 1, 'b': 11, 'c': 45}
num5 = 49
c1 = chr(num5)
print(type(c1))
>>> <class 'str'>
print(c1) # 因为49对应的ASCII码就是1
>>> 1
s1 = '3'
asc1 = ord(s1)
print(asc1) # 因为ASCII码是3的对应整数是51
>>> 51
num6 = 12
a = hex(num6)
b = bin(num6)
c = oct(num6)
print(a, b, c)
>>> 0xc 0b1100 0o14
f=(lambda x,y,z=10: x+y+z)
f(3,4)
l3 = [ (lambda x: x*2), (lambda y: y*3)]
for i in l3:
print(i(4)) # 函数调用,注意l3是列表,所以i代表两个lambda表达式
>>>
8
12
def f1(x):
def f2(y):
return y ** x
return f2
print(f1(3))
a1 = f1(3) # 注意,a1是一个函数,x是3
位置参数:从左到右,精准匹配
关键字参数:“name=value”
可变参数:
f10(x=1, y=2, z=9)
--> {‘x’: 1, ‘y’: 2, ‘z’: 9}可变参数解包
# 可变参数解包:在调用函数时使用,刚好和可变参数相反,这是分解参数
l1 = ['Sun', 'Mon', 'Tus']
def f14(x, y, z):
print(x, y, z)
f14(*l1) # 元素个数需要和函数参数匹配
l2 = ['a', 'b']
d1 = {'k1':1, 'k2':2, 'k3':3}
def f16(x, *y, **z):
print(x)
print(y)
print(z)
f16(m, *l2, **d1)
>>>
3
('a', 'b')
{'k1': 1, 'k2': 2, 'k3': 3}
filter(function,iterable)
一一排查,需要bool ,return的对象,需要 listmap(function,iterable,…)
一一对应,return的对象,需要 listreduce()
做累积操作l1 = [0, 1, 2, 3, 4, 5, 6]
l2 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
# 使用zip来将并排元素配成元组,并行遍历
for (k, v) in zip(l1, l2):
for i in l1:
d1 = {0: 'Sun', 1: 'Mon', 2: 'Tue'}
for k, v in d1.items():
[i for i in list1 if i.endswith('.ipynb')]
[(i, j) for i in l1 for j in l2 if j != 1]
print((i**2 for i in range(1, 11))) # 注意返回的是生成器对象
g1 = (i**2 for i in range(1, 11))
print(g1.__next__())
print(g1.__next__())
print(g1.__next__())
print(g1.__next__())
>>>
<generator object <genexpr> at 0x000001449EE0CCF0>
1
4
9
16
# 生成1到10的平方
for i in (j**2 for j in range(1, 11)):
print(i)
>>>
1
4
9
16
25
36
49
64
81
100
range 也是生成器
enumerate 枚举生成器
生成器
# 也可以使用含有yield的函数来生成
def gen_num(x):
i = 1
while i <= x:
yield i**2 # 遇到yield就返回其后面的信息
i += 1
g1 = gen_num(10) # 返回的是生成器对象
print(type(g1))
# print(next(g1)) # 输出一个
for i in g1:
print(i)
>>>
<class 'generator'>
1
4
9
16
25
36
49
64
81
100
def deco(func):
def wrapper(x):
print("please say something:")
func(x)
print("No zuo no die.")
return wrapper
@deco
def show(x):
print(x)
show("I am from Mars.") # 原来函数只说一句话,现在将其增强为说三句话
>>>
please say something:
I am from Mars.
No zuo no die
import sys
print(sys.path) # # 第一个就是程序主目录,当前路径