ISP成像算法基础Day2—Numpy

NumPy是在1995年诞⽣的Python库Numeric的基础上建⽴起来的。

但真正促使NumPy的发⾏的是 Python的SciPy库,SciPy是2001年发⾏的⼀个类似于Matlab,Maple,Mathematica等数学计算软件的Python库,它实现⾥ ⾯的⼤多数功能

但SciPy中并没有合适的类似于Numeric中的对于基础的数据对象处理的功能。于是,SciPy的开发者将 SciPy中的⼀部分和Numeric的设计思想结合,在2005年发⾏了NumPy。


Numpy有什么?

创建n维数组(矩阵)

对数组进行函数运算

数值积分

线性代数运算

傅里叶变换

随机数产生

Numpy 诞生为了弥补List的缺陷。它提供了两种基本的对象:

ndarray:全称(n-dimensional array object)是储存单⼀数据类型的多维数组。

ufunc:全称(universal function object)它是⼀种能够对数组进⾏处理的函数。


Numpy Ndarray

• ⼀个指向数据(内存或内存映射⽂件中的⼀块数据)的指针。

• 数据类型或 dtype,描述在数组中的固定⼤⼩值的格⼦。

一个表示数组形状(shape)的元组,表示各维度大小的元组

一个跨度元组(strdep) 其中的整数指的是为了前进到当前维度下⼀个元素需要"跨过"的字节数。

ISP成像算法基础Day2—Numpy_第1张图片

ndarray的创建

来⾃list和数据 • 特殊的创建

从列表创建

NumPy中的核⼼对象是ndarray

ndarray可以看成数组,类似于matlab的向量或者矩阵。

NumPy⾥⾯所有的函数都是围绕ndarray展开的。

a=np.array([1,2,3,4])

b=np.array((5,6,7,8))

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

ISP成像算法基础Day2—Numpy_第2张图片


特殊生成

一维初始化

根据步长创建

a=np.array(0,1,0.1)

根据点数创建

b=np.linspace(0,1,10)

c=np.linspace(0,1,10,endpoint=False)

在Log域根据点数创建

d=np.logspace(0,2,5)

多维初始化

空数组

a=np.empty((2,3),np.int)

全零

b=np.zeros((2,4),np.int)

全一

c=np.ones((6,3),np.int)

其他值

d=np.full((6,3),np.pi)

自定义

def func(i,j):
    return i % 4 + 1
e = np.fromfunction(func,(10,4))
print("e=",e)

数组属性

ISP成像算法基础Day2—Numpy_第3张图片


常用的属性

ndarray的元素具有相同的元素类型。常用的有int(整型)float(浮点型),complex(复数型)

a=np.array([1,2,3,4].dtype=float)
print(a.dtype)
a=np.array([1,2,3,4])
print(a.dtype)

ndarray的shape属性用来获得它的形状,也可以自己指定

c=np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])
print(c.shape)
a=np.array([1,2,3,4])
d=a.reshape((2,2))

维度属性

ISP成像算法基础Day2—Numpy_第4张图片


查看存储

• 从最后的维度存储
 

ls=[[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[13,14,15,16],[17,18,19,20],[21,22,23,24]]]

a=np.array(ls,dtype=int)

print(a)

print(a.strides)

ISP成像算法基础Day2—Numpy_第5张图片


ndarray的切片

ndarray通过切片产生一个新的数组b,b和a共享同一块数据存储空间。如果想改变这种情况,我们可以用列表对数组元素切片。或者使用copy函数

import numpy as np
a = np.arange(10)
print("a=",a)
a[2:4] = 100, 101
b = a[3:7]    #浅copy
b[2] = -10    #b改变a也会改变
print("a=",a)
print("b=",b)
c = a[[3, 3, -3, 8]] #深copy
print("c=",c)
c[2] = 100   #C改变a不改变
print("a=",a)
print("c=",c)
d= a[3:7].copy() #深copy
d[2] = -99  #D改变a不改变
print("a=",a)
print("b=",b)
print("d=",d)
d= np.zeros(shape=(4))
d[:]= a[3:7]
d[2] = -99
print("a=",a)
print("b=",b)
print("d=",d.astype(int))

a= [0 1 2 3 4 5 6 7 8 9]
a= [  0   1 100 101   4 -10   6   7   8   9]
b= [101   4 -10   6]
c= [101 101   7   8]
a= [  0   1 100 101   4 -10   6   7   8   9]
c= [101 101 100   8]
a= [  0   1 100 101   4 -10   6   7   8   9]
b= [101   4 -10   6]
d= [101   4 -99   6]
a= [  0   1 100 101   4 -10   6   7   8   9]
b= [101   4 -10   6]
d= [101   4 -99   6]

Process finished with exit code 0


负索引

当做切⽚的操作的时候-1代表最后的元素,-2代表倒数第⼆ 个.负索引还可以⽤作其它的时候如reshape.

import numpy as np

b = np.arange(0, 60, 10)
c = b.reshape(-1,1)

print(b[-1])
print(c[-2])  #这个打印和下个打印不一样,是一个行元素
print(c[-2,0])

50
[40]
40


结构数组

C语⾔中可以通过struct关键字定义结构类型。NumPy中也 有类似的结构数组。

import numpy as np
#如何定义一个结构体
persontype = np.dtype({ 'names':['name', 'age', 'weight'],'formats':['S30','i', 'f']})
a = np.array([("Zhang", 32, 75.5), ("Wang", 24, 65.2)],dtype=persontype)
print(a[0])

ufunc简介

ufunc是universal function的简称,它是⼀种能对数组每个 元素进⾏运算的函数。NumPy的许多ufunc函数都是⽤C语⾔ 实现的,因此它们的运算速度⾮常快。

import numpy as np
#import math
x=np.linspace(0,2*np.pi,10)
y=np.sin(x)
print(y)

[ 0.00000000e+00  6.42787610e-01  9.84807753e-01  8.66025404e-01
  3.42020143e-01 -3.42020143e-01 -8.66025404e-01 -9.84807753e-01
 -6.42787610e-01 -2.44929360e-16]


四则运算

NumPy提供了许多ufunc函数,它们和相应的运算符运算结果 相同

>np.subtract(a,b)#减法

>np.multiply(a,b)#乘法

>np.divide(a,b) #如果两个数字都为整数,则为整数除法

>np.power(a,b) #乘方


比较运算和布尔运算

使⽤==,>对两个数组进⾏⽐较,会返回⼀个布尔数组,每⼀ 个元素都是对应元素的⽐较结果。

> np.array([1, 2, 3]) < np.array([3, 2, 1])

array([ True, False, False], dtype=bool)

布尔运算在Numpy中也有对应的ufunc函数

ISP成像算法基础Day2—Numpy_第6张图片

 


自定义ufunc函数

Numpy提供的标准ufunc函数可以组合出复合的表达式,但是有些情况下,自己编写的则为更方便。我们可以把自己编写的函数用frompyfunc()转化成ufunc函数.

frompyfunc(func,nin,nout)

func:计算函数 nin:func()输⼊参数的个数 nout:func()输出参数的个数

import numpy as np


def num_judge(x,a): #对于一个数字如果使3或5的倍数
    if x % 3 ==0:
        r=0
    elif x % 5 ==0:
        r=0
    else:
        r=a
    return r

x=np.linspace(0,10,11)
y=np.array([num_judge(t,2)for t in x])#列表生成式
print(y)
numb_judge = np.frompyfunc(num_judge,2,1)
y=numb_judge(x,2)
print(y)

[0 2 2 0 2 0 0 2 2 0 0]
[0 2 2 0 2 0 0 2 2 0 0]


广播broadcasting

使⽤ufunc对两个数组进⾏运算时,ufunc函数会对两个数组的 对应元素进⾏运算。如果数组的形状不相同,就会进⾏下⼴播 处理。

简⽽⾔之,就是向两个数组每⼀维度上的最⼤值靠⻬。

 

ISP成像算法基础Day2—Numpy_第7张图片

ISP成像算法基础Day2—Numpy_第8张图片

 

ISP成像算法基础Day2—Numpy_第9张图片

 

import numpy as np
a = np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)
b = np.arange(0, 60, 10)
c = b.reshape(-1,1)
d = np.arange(0, 6)
e = c+d
print(a)
print(b)
print(c)
print(d)
print(e)
x, y = np.ogrid[:5, :5]
print(x)
print(y)
z= np.arange(4)
print(z[None, :])
print(z[:, None])

[[ 0  1  2  3  4  5]
 [10 11 12 13 14 15]
 [20 21 22 23 24 25]
 [30 31 32 33 34 35]
 [40 41 42 43 44 45]
 [50 51 52 53 54 55]]
[ 0 10 20 30 40 50]
[[ 0]
 [10]
 [20]
 [30]
 [40]
 [50]]
[0 1 2 3 4 5]
[[ 0  1  2  3  4  5]
 [10 11 12 13 14 15]
 [20 21 22 23 24 25]
 [30 31 32 33 34 35]
 [40 41 42 43 44 45]
 [50 51 52 53 54 55]]
[[0]
 [1]
 [2]
 [3]
 [4]]
[[0 1 2 3 4]]
[[0 1 2 3]]
[[0]
 [1]
 [2]
 [3]]

Process finished with exit code 0
 



随机数

NumPy产⽣随机数的模块在random⾥⾯,其中有⼤量的分布⽅式。

rand: 0到1之间的随机数 normal:正态分布的随机数

randint:制定范围内的随机整数

uniform:均匀分布

randn:标准正太的随机数

poisson:泊松分布

choice:随机抽取样本

shuffle:随机打乱顺序


求和,平均值,方差

NumPy在均值等⽅⾯常⽤的函数如下:

sum:求和

average:加权平均值

var:方差

mean:期望

std:标准差

product:连乘积


特殊的参数和广播

axis,out,leepdims等特殊参数

import numpy as np
#随机数的例子
np.random.seed(42)
a = np.random.randint(0,10,size=(4,5))
print("a=",a)
print("np.sum(a, axis=1)=",np.sum(a, axis=1)) #第1维方向的数字的sum,也就是y方向的每横中数字和
print("np.sum(a, axis=0)=",np.sum(a, axis=0)) #第0维方向的数字的sum,也就是x方向的每列中数字和
print("np.sum(a,1,keepdims=True)=",np.sum(a,1,keepdims=True))
print("np.sum(a,0,keepdims=True)=",np.sum(a,0,keepdims=True))

#又有广播
#Maximum是逐点⽐较
a = np.array([1, 3, 5, 7])
b = np.array([2, 4, 6])
#b[:, None],a[None, :] 相当于reshape
print(np.maximum(a[None, :], b[:, None]))#maxinum返回两组矩阵广播计算后的结果

a= [[6 3 7 4 6]
 [9 2 6 7 4]
 [3 7 7 2 5]
 [4 1 7 5 1]]
np.sum(a, axis=1)= [26 28 24 18]
np.sum(a, axis=0)= [22 13 27 18 16]
np.sum(a,1,keepdims=True)= [[26]
 [28]
 [24]
 [18]]
np.sum(a,0,keepdims=True)= [[22 13 27 18 16]]
[[2 3 5 7]
 [4 4 5 7]
 [6 6 6 7]]


大小 排序 统计

sort: 对数组进行排序会改变数组的内容,返回一个新的数组

percentile:percentile计算处于p%上的值

unique: unique有两个参数,return_index=True同时返回原始数组中的下标,return_inverse=True表示原始数据在新数组的下标

bincount:bincount()对非负整数数组中的各个元素出现的次数进行统计,返回数组中的第i个元素是整数i出现的次数。

histogram:对以为数字进行直方图统计,其参数为:

histogram(a,bins=10,range=None,weight=None)

函数返回两个一维数组,hist是每个区间的统计结果,bin_edges返回区间的边界


多维数组拼接

vstack(),hstack(),column_stack()拼接函数

import numpy as np
a1 = np.arange(1,11,2)
b1 = np.arange(5)
print(a1)
print(b1)
v1 = np.vstack((a1,b1))
h1=np.hstack((a1,b1))
c1 = np.column_stack((a1,b1))
print(v1)
print(h1)
print(c1)

[1 3 5 7 9]
[0 1 2 3 4]
[[1 3 5 7 9]
 [0 1 2 3 4]]
[1 3 5 7 9 0 1 2 3 4]
[[1 0]
 [3 1]
 [5 2]
 [7 3]
 [9 4]]

Process finished with exit code 0
 


操作多维数组

import numpy as np

a = np.array([6, 3, 7, 4, 6, 9, 2, 6, 7, 4, 3, 7])
b = np.array([ 1,  3,  6,  9, 10])
c = np.array([2,4,6,8])
print(np.split(a, b))# 按元素位置进行分段
print(np.split(a, c))
print(np.split(a, 4))
print(np.split(a,6))

[array([6]), array([3, 7]), array([4, 6, 9]), array([2, 6, 7]), array([4]), array([3, 7])]
[array([6, 3]), array([7, 4]), array([6, 9]), array([2, 6]), array([7, 4, 3, 7])]
[array([6, 3, 7]), array([4, 6, 9]), array([2, 6, 7]), array([4, 3, 7])]
[array([6, 3]), array([7, 4]), array([6, 9]), array([2, 6]), array([7, 4]), array([3, 7])]


其它的库 • scipy • matplotlib • opencv
未完待续~


你可能感兴趣的:(ISP,Tuning,numpy,算法,python,isp,图像处理)