openCV中NumPy模块使用详解见我另一篇博客。
Windows下Python-openCV学习(三)-------像素获取和NumPy模块
什么是NumPy?
NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。
Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。 这个开源项目有很多贡献者。
NumPy是C语言实现的,所以其运算速度非常快。具体功能如下:
1、有一个强大的N维数组对象ndarray
2、广播功能方法
3、线性代数、傅里叶变换、随机数生成、图形操作等
4、整合C/C++/Fortran代码工具
NumPy中数组的类型有如下:
bool_
布尔型数据类型(True 或者 False)
int_
默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc
与 C 的 int 类型一样,一般是 int32 或 int 64
intp
用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
int8
字节(-128 to 127)
int16
整数(-32768 to 32767)
int32
整数(-2147483648 to 2147483647)
int64
整数(-9223372036854775808 to 9223372036854775807)
uint8
无符号整数(0 to 255)
uint16
无符号整数(0 to 65535)
uint32
无符号整数(0 to 4294967295)
uint64
无符号整数(0 to 18446744073709551615)
float_
float_ 是float64 类型的简写
---------------------------------------------------------------------------------------------
float16
半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32
单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64
双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_
complex128 类型的简写,即 128 位复数
complex64
复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128
复数,表示双 64 位浮点数(实数部分和虚数部分)
使用NumPy创建数组
1、常规array方法
numpy.array(object,dtype,copy,order,subok,ndmin)
参数:
object :任何具有数组接口方法的对象
dtype : 数据类型
copy : 布尔型,可选参数。默认值为True,则object参数被复制;否则,只有当__array__返回副本,
object参数为嵌套序列,或者需要副本满足数据类型和顺序要求时,才会生成副本。
order : 元素在内存中出现的顺序,其值为K,A,C,F。如果object参数不是数组,则新创建的数组将按行排
列(C),如果值为F,按列排列;如果object参数是一个数组,则以下顺序成立:
C(按行) F(按列) A(原顺序) F(元素在内存中出现的位置)。
subok : 默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类。
ndmin : 指定生成数组的最小维数
下面我们来看几个小例子:
1.1 创建一维数组和二维数组
import numpy as np
n1=np.array([1,2,3])
n2=np.array([[1,2],[3,4]])
print("一维数组")
print(n1)
print("二维数组")
print(n2)
输出:
一维数组
[1 2 3]
二维数组
[[1 2]
[3 4]]
1.2 创建指定类型数组
#创建浮点类型数组
import numpy as np
stl=[1,2,3]
n1=np.array(stl,dtype=np.float_)
print(n1)
输出
[1. 2. 3.]
1.2 创建三维数组
方法一
import numpy as np
n1=np.array([[[1,2,3],[4,5,6]]])
print(n1)
方法二
import numpy as np
n1=np.array([1,2,3],ndmin=3)
print(n1)
输出
[[[1 2 3]]]
2、创建指定维度和数据类型未初始化数组
numpy.empty(shape, dtype, order)
参数:
shape :int 或 int的tuple
空数组的Shape,例如,(2, 3)或2
dtype :data-type, 可选
数组所需的输出数据类型,例如, numpy.int8 默认值为numpy.float64.
order :{‘C’, ‘F’}, 可选, 默认: ‘C’
是否以行优先(C样式)或列优先(Fortran样式)的顺序存储多维数据在内存中。
创建一个未初始化的,两行三列未初始化,int类型数组
import numpy as np
n1=np.empty((2,3),dtype=np.int_)
print(n1)
输出
[[-707327008 32764 -707322496]
[ 32764 0 0]]
3、创建纯0填充的数组
numpy.zeros(shape, dtype=float, order='C')
参数:
shape:int或int元组
新阵列的形状,例如,或。(2, 3)2
dtype:数据类型,可选
数组的所需数据类型,例如numpy.int8。默认是 numpy.float64。
order : {'C','F'},可选,默认:'C'
是否在内存中以行主(C风格)或列主(Fortran风格)顺序存储多维数据。
创建三行三列数据类型为无符号整形的纯0数组
import numpy as np
n1=np.zeros((3,3),dtype=np.uint8)
print(n1)
输出:
[[0 0 0]
[0 0 0]
[0 0 0]]
4、创建纯1填充数组
numpy.ones(shape, dtype=float, order='C')
shape : int或int的序列
新数组的形状,例如,(2, 3)或2
dtype : 数据类型,可选
数组的所需数据类型,例如numpy.int8。默认是 numpy.float64。
order : {'C','F'},可选,默认值:C
是否在内存中以行主(C-风格)或列主(Fortran-风格)顺序存储多维数据。
创建三行三列数据类型为无符号整形的纯1数组
import numpy as np
n1=np.ones([3,3],dtype=np.uint8)
print(n1)
输出
[[1 1 1]
[1 1 1]
[1 1 1]]
5、创建随机数组
np.random.randint(low,high,size)
参数:
low:随机数最小取值范围
high:可选参数,随机数最大取值范围,若high为空,取值范围为(0,low),不为空为(low,high).
high>low
size:可选参数,数组维度
随机生成10个1~3且不包括3的整数
import numpy as np
n1=np.random.randint(1,3,10)
print(n1)
输出
[2 1 1 2 2 2 1 1 1 2]
随机生成1~3,以内的二维数组
import numpy as np
n1=np.random.randint(1,3,size=(2,3))#两行三列
print(n1)
输出:
[[1 2 2]
[2 2 1]]
操作数组
1、加减乘除幂运算
import numpy as np
n1=np.array([1,2],dtype=np.float_)
n2=np.array([3,4],dtype=np.float_)
print(f'n1:\n{n1}')
print(f'n2:\n{n2}')
print('----')
print(f'n1+n2 \n{n1+n2}')
print('----')
print(f'n2-n1 \n{n2-n1}')
print('----')
print(f'n1*n2 \n{n1*n2}')
print('----')
print(f'n2/n1 \n{n2/n1}')
print('----')
print(f'n1**n2 \n{n1**n2}')
输出
n1:
[1. 2.]
n2:
[3. 4.]
----
n1+n2
[4. 6.]
----
n2-n1
[2. 2.]
----
n1*n2
[3. 8.]
----
n2/n1
[3. 2.]
----
n1**n2
[ 1. 16.]
2、比较运算
import numpy as np
n1=np.array([1,2,3])
n2=np.array([4,5,6])
print(n1>=n2)
print(n1<=n2)
print(n1==n2)
print(n1!=n2)
输出
[False False False]
[ True True True]
[False False False]
[ True True True]
3、数组的复制
import numpy as np
n1=np.array([1,2,3])
n2=np.array(n1,copy=True)
print(n2==n1)
n2[1]=0
print(n1)
print(n2)
n2=n1.copy()#这种方法比较常用
print(n1==n2)
输出
[ True True True]
[1 2 3]
[1 0 3]
[ True True True]
数组的索引
1、一维数组索引
import numpy as np
n1=np.array([1,2,3])
n2=n1[0]
print(n2)
输出
1
2、一维数组切片索引
[起始索引,终止索引,步长]
起始索引 :不写任何值表示从0开始
终止索引 :不写任何值表示到末尾全部索引
[起始索引,终止索引),注意是左闭右开
示例
import numpy as np
n1=np.array([0,1,2,3,4,5,6,7,8,9])
print(n1)
print(n1[:3])
print(n1[3:6])
print(n1[5:])
print(n1[3:6:2])
print(n1[::])
print(n1[:])
print(n1[::2])
print(n1[2::2])
print(n1[::-1])
print(n1[-1:-4:-1])#n1[-1:-4]这种写法是错误的,步长默认是1不是-1
print(n1[-3::-1])
输出
[0 1 2 3 4 5 6 7 8 9]
[0 1 2]
[3 4 5]
[5 6 7 8 9]
[3 5]
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[0 2 4 6 8]
[2 4 6 8]
[9 8 7 6 5 4 3 2 1 0]
[9 8 7]
[7 6 5 4 3 2 1 0]
3、二维数组索引
arry[n,m]
n:行
m:列
示例
import numpy as np
n1=np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
print(n1)
print('-------')
print(n1[1])
print(n1[1,2])
print(n1[-1])
print(n1[-1,-1])
print('-------')
print(n1[:2,1:])
print('-------')
print(n1[1,:2])
print('-------')
print(n1[:2,2])
print('-------')
print(n1[:,:1])
输出
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
-------
[4 5 6 7]
6
[ 8 9 10 11]
11
-------
[[1 2 3]
[5 6 7]]
-------
[4 5]
-------
[2 6]
-------
[[0]
[4]
[8]]