第二篇 CV基础之numpy基础

numpy 基础

开篇

这学期在学习CV,学的怎么说呢?觉得虽然课后作业写的快疯了期中考试还考炸了,对CV还是依旧充满热情的。

CV里面到处的线性代数,矩阵搞来搞去,很烦,所以就有了numpy 这个神奇的库,里面的矩阵乘法不知道要比自己手下的function快了多少倍,总之水平很高。

在码代码的时候,发现自己很多numpy 函数及其用法自己需要百度,而且不止一次,所以在此准备总结一下,把一些挺有用的po出来给自己复习整理下,也给有需要的读者看下。

import numpy as np

OK, 首先引用下numpy 的这个库,引用为np。而后博文种的numpy 都以np 来代替。好,开始了,开始了,搞快点,搞快点。

np.load & np.save

np.load 这个函数是读取.npy,和 .npz 文件的,np.save 是来储存.npy 文件的。

首先在一个文件里创建一个array

A = np.array([[1, 2], [3, 4]]) 
np.save("文件名.npy", A)

运行以后,就会在项目文件里看到 文件名.npy 这个文件。
然后

A1 = np.load("文件名.npy")

这样就把文件 文件名.npy 读取进去,并且赋值给A1。此处有点要注意一下,如果A 不是一个array 类型,而是一个list 类型,在save 这一步操作的时候,list 就转变为 array 类型了,此后 load 出来也还是 array 类型。

array 和 list 的互相转换

list 不能用.shape 看长多少,得用len(A)来看list 的长度(A为一个list)

A = [1, 3, 5, 7] // 生成一个list
A_array = np.array(A) //将A 转为 array 

这样子将list转为array

反过来:

A = np.array([[1, 2], [3, 4]]) 
B = A.tolist()
print(len(B))

tolist() 将array转为list,这里print的值是2。

np.ones, np.zeros ,np.eye 和 np.random.rand

这些函数是可以在初始化矩阵的时候用的。

A = np.ones((3, 4))
print(A)
***** 输出结果
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]

ones 这里是输出都是一的矩阵,ones((m, n)) 其中,m 是矩阵的行(row),n是矩阵的列(column)。

A = np.zeros((4,3))
print(A)
***** 输出结果
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

zeros 这里是输出都是零的矩阵,zeros((m, n)) 其中,m 是矩阵的行(row),n是矩阵的列(column)。

A = np.eye(5)
print(A)
***** 输出结果
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

eye(n) 为输出的单位矩阵。

A = np.random.rand(3,5)
print(A)
***** 输出结果
[[0.86806325 0.08199208 0.34622382 0.81914498 0.61603182]
 [0.1953756  0.79033466 0.72956591 0.2492465  0.08664741]
 [0.76575421 0.44945336 0.82979394 0.50521213 0.10743566]]

这个是生成随机矩阵,矩阵中每个元素的值的范围是(0,1)。random.rand(m, n),其中m 是矩阵的行(row),n是矩阵的列(column)。
在这边注意了,ones 和 zeros 是两组括号,随机矩阵这里是一组括号。

.npz 文件 和 np.savez

前些日子写了一个作业,这作业贼骚,突然出现个.npz 文件,当时我是很懵逼的。
查阅资料后,发现这个.npz 文件是真的骚。

首先,讲下npz怎么生成的。

A = np.random.rand(3,5)
B = np.random.rand(3,4)
np.savez("npzsao.npz", A, B)## 1
np.savez("npzsao2.npz", a1 = A, b2 = B) ## 2

然后项目文件夹下会有两个文件 “npzsao.npz” 和 “npzsao2.npz”
然后读取这两个文件,也是用load。

R1 = np.load("npzsao.npz") ##11

print(R1["arr_0"])
print(R1["arr_1"])
***** 输出结果
[[0.47556827 0.29387133 0.36328968 0.31729787 0.47300145]
 [0.67747181 0.90876861 0.45261307 0.77728184 0.71134529]
 [0.08951553 0.35206101 0.26871332 0.64145026 0.76406003]]
[[0.71021541 0.36180441 0.33034119 0.81359045]
 [0.06506133 0.61303059 0.70532766 0.82507813]
 [0.39187053 0.8249775  0.96176554 0.02729636]]

R2 = np.load("npzsao2.npz") ## 22
print(R2["a1"])
print(R2["b2"])
***** 输出结果
[[0.47556827 0.29387133 0.36328968 0.31729787 0.47300145]
 [0.67747181 0.90876861 0.45261307 0.77728184 0.71134529]
 [0.08951553 0.35206101 0.26871332 0.64145026 0.76406003]]
[[0.71021541 0.36180441 0.33034119 0.81359045]
 [0.06506133 0.61303059 0.70532766 0.82507813]
 [0.39187053 0.8249775  0.96176554 0.02729636]]

这里注意一下后面comment 1 和2 的程序,1就是A,B,2 里面把A、B命名了,分别命名为a1, b2。np.savez 可以想象把不同的数据(这里A和B)专成.npy文件,并且把这些.npy文件打包并压缩生成一个.npz文件,这个z代表zip的意思。如果像1一样不命名,这里.npy专用压缩文件.npz里的.npy文件就会以“arr_0”, “arr_1”,"arr_2"的形式命名。如果像2这样的话,就是按自己的命名方式命名。

但是,有种情况就很骚了,有个人发给你一个.npz文件,我也不知道这个.npz文件咋整儿,到底是按哪种方式命名的。“arr_0”,“arr_1”不行,也不知道里面压了几个.npy文件。这可咋整呢?

么得关系,我们可以用解压缩得软件给unzip掉,我这里自己用得7zip压缩软件,提取到文件。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

矩阵的运算

这里讲一下,矩阵的基本运算。
先讲下乘法。

A = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])

B = np.array([[3, 1, 5],
             [2, 4, 8],
             [9, 6, 7]])

C1 = A*B
C2 = np.dot(A, B)
C3 = np.matmul(A, B)

print(C1)
print(C2)
print(C3)

***** 输出结果
[[ 3  2 15]
 [ 8 20 48]
 [63 48 63]]
[[ 34  27  42]
 [ 76  60 102]
 [118  93 162]]
[[ 34  27  42]
 [ 76  60 102]
 [118  93 162]]

在这里,直接星号相乘(*)是矩阵中各个元素相乘。
np.dot() 和 np.matmul() 功能相同,是矩阵的乘法。

矩阵的转置和矩阵的逆

A = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])

C1 = A.T ##转置
C2 = np.linalg.inv(A) ##逆

***** 输出结果
[[1 4 7]
 [2 5 8]
 [3 6 9]]
[[ 3.15251974e+15 -6.30503948e+15  3.15251974e+15]
 [-6.30503948e+15  1.26100790e+16 -6.30503948e+15]
 [ 3.15251974e+15 -6.30503948e+15  3.15251974e+15]]

矩阵的特征值与特征向量

强大的numpy还有好用的特征值与特征向量的功能。

A = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])

a, v =np.linalg.eig(A)
print(a)
print(v)
***** 输出结果
[ 1.61168440e+01 -1.11684397e+00 -9.75918483e-16]
[[-0.23197069 -0.78583024  0.40824829]
 [-0.52532209 -0.08675134 -0.81649658]
 [-0.8186735   0.61232756  0.40824829]]

np.linalg.eig(A)输出两个值,一个是特征值,另一个是特征值所对应的特征向量。

展开阅读全文

没有更多推荐了,返回首页