ndarray的矩阵操作
基本矩阵操作
- 加法
nd = np.random.randint(0, 10, size=(5, 4))
# 矩阵加上单个数值相当于每个基本元素都加上该值
nd + 3
- np.add()求和
不对原数组产生影响
# 矩阵上每个数值都加上10
np.add(nd, 10)
# 矩阵相加
np.add(nd, nd)
- np.multiply()乘积
不对原来的结果产生影响
np.multiply(nd, 10)
- 矩阵乘积np.dot
a矩阵列数必须等于b举证的行数
np.dot(a, b)
- 三维乘一维
- 三维乘二维
广播机制
两条规则
1. 为缺失的维度补1
2. 假定缺失元素用已有值填充
nd1 = np.ones((2, 3))
nd1
>>>array([[1., 1., 1.],
[1., 1., 1.]])
nd2 = np.arange((3))
nd2
>>>array([0, 1, 2])
nd1 + nd2
>>>array([[1., 2., 3.],
[1., 2., 3.]])
ndarray的排序
方法一:
nd = np.random.randint(0, 150, size=10)
for i in range(nd.size):
for j in range(i, nd.size):
if nd[i] > nd[j]:
nd[i], nd[j] = nd[j], nd[i]
nd
方法二:
def sort_nd(nd):
for i in range(nd.size):
# 不加上i索引会乱
min_index = nd[i:].argmin() + i
nd[i], nd[min_index] = nd[min_index], nd[i]
sort_nd(nd)
nd
快速排序
np.sort()与ndarray.sort()都可以,但有区别:
* np.sort()不改变输入
* ndarray.sort()本地处理,不占用空间,但改变输入
nd = np.random.randint(0, 10, size=10)
np.sort(nd) # 不改变原数组
nd.sort() # 改变原数组
print(nd2)
部分排序
nd = np.random.randint(0, 1000, size=100)
np.partition(nd, -5)[-5:] # 最大的五个数
np.partition(nd, 5)[:5] # 最小的五个数(未排序)
np.sort(np.partition(nd, 5)[:5])
图片换脸
需要从cv2库
安装cv2库:pip install opencv-python
import numpy as np
import cv2
import matplotlib.pyplot as plt
- 导入图片
sanpang = cv2.imread('./jinzhengen.png')
sanpang
plt.imshow(sanpang[:, :, ::-1]) # 展示图片(rgb改变)
- 导入要替换的脸
dog = cv2.imread('dog.jpg')
dog
plt.imshow(dog[:, :, ::-1])
- 识别人脸区域, 需要算法(已经自动提供)
face_det = cv2.CascadeClassifier('./data/haarcascade_frontalface_default.xml')
- 使用算法自动寻找三胖的脸
# 得到一个ndarray,是人脸的区域
face_zone = face_det.detectMultiScale(sanpang)
face_zone
- 裁切狗脸
dog_face = dog[40:180, 70:240] # 根据图片裁切脸部区域
dog_face.shape
- 压缩狗脸
dog_face2 = cv2.resize(dog_face), (61, 61))
plt.imshow(dog_face2)
- 进行循环
for x, y, w, h in face_zone:
sanpang[y:y+w, x:x+w] = dog_face2
- 查看效果
plt.imshow(sanpang[:, :, ::-1])