一、Numpy(Numerical Python)

是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。使用前需导入numpy模块

二、相关方法

(1)创建矩阵

import numpy as np      # 导入模块          
    a1 = np.array([1, 3, 2])   # 创建一维array对象          
    # 创建一个2 x 3 矩阵 , 输入参数实际为列表或元组,列表或元组内部元素又是列表或元组数值          
    a2 = np.array([1, 3, 2], [4, 3, 6])   # 创建二维array对象

(2)矩阵元素获取

A、获取矩阵的行数和列数             
       size = a1.shape()          # 返回元组(1, 0)        
    B、获取一维矩阵的第三个元素             
       b1 = a1[2]               
    C、获取二维矩阵的第二行             
       b2 = a2[1]   或 b2 = a2[1, ]  或 b2 = a2[1, :]            
    D、获取二维矩阵的第二列            
       b3 = a2[:, 1]               # 注:返回值为行向量形式       
    E、获取二维矩阵的第1,2行的第3,4两列            
       b4 = a2[0:2, 2:4]        
    F、获取二维矩阵的第二行第三个元素          
       b3 = a2[1, 2]

(3)按条件截取 ------按条件截取其实是在[](方括号)中传入自身的布尔语句

import numpy as np          
   a3 = np.array([[1, 3, 2], [4, 3, 6], [7,5,3]])           
   c1 = a3 > 2           
   print(c1)          
   # 返回布尔值矩阵         
   [[False  True False]          
   [ True  True  True]          
   [ True  True  True]]          
   c2 = a3[a3 > 2]          
   print(c2)
   # 返回满足条件的一维列表          
   [3 4 3 6 7 5 3]

(4)矩阵的合并

按行合并-----np.hstack([矩阵1, 矩阵2]) 或   np.hstack((矩阵1, 矩阵2))         
     按列合并-----np.vstack([矩阵1, 矩阵2]) 或   np.vstack((矩阵1, 矩阵2))        
     
     矩阵合并也可用concatenate方法            
     np.concatenate( (矩阵1, 矩阵2), axis=0 ) 等价于 np.vstack( (矩阵1, 矩阵2) )           
     np.concatenate( (矩阵1, 矩阵2), axis=1 ) 等价于 np.hstack( (矩阵1, 矩阵2) )
import numpy as np         
   a1 = np.array([[7, 5, 2], [4, 2, 5]])         
   a2 = np.array([[1, 3, 2], [4, 3, 6]])         
   h = np.hstack([a1, a2])  或 h = np.hstack((a1, a2))# 按行合并            
   print(h)             
   #返回         
   [[7 5 2 1 3 2]          
    [4 2 5 4 3 6]]         
   v = np.vstack([a1, a2])  或 h = np.vstack((a1, a2))# 按列合并               
   print(v)             
   #返回         
   [[7 5 2]          
    [4 2 5]          
    [1 3 2]          
    [4 3 6]]

(5)通过函数常见矩阵

A、通过linspace(a,b,c)方法创建等差数列,首位为a,末位为b,包含c个元素的等差数列             
       a1 = np.linspace(2, 10, 5)          # 返回[  2.   4.   6.   8.  10.]        
    B、通过logspace(a,b,c)方法创建等比数列,首位为a^2, 末位为b^5, 包含c个元素的等比数列            
       a2 = np.logspace(2, 5, 4)         # 返回[    100.    1000.   10000.  100000.]               
    C、通过ones方法创建全1矩阵             
       a3 = np.ones(3,4)                   # 创建3*4的全 1 矩阵         
    D、通过zeros方法创建全0矩阵             
       zeros(shape, dtype=float, order='C')                        
         shape:为 H * W *3,即 高度 * 宽度 * 3通道 或者 行数 * 列数 *3通道                       
         返回:返回来一个给定形状和类型的用0填充的数组;             
       a3 = np.zeros(3,4)                # 创建3*4的全 0 矩阵                    
    E、通过eye方法创建单位矩阵             
       a3 = np.eye(3,4)                  # 创建3*4的单位矩阵       
    F、通过fromstring方法将字符串转换成array对象,可以将字符批量转换成ASCII码             
       a = "abcdef"                    
       b = np.fromstring(a,dtype=np.int8)       # 因为一个字符为8为,所以指定dtype为np.int8             
       print(b)                   # 返回 [ 97  98  99 100 101 102]        
    G、通过fromfunction方法根据行号和列号生成矩阵             
       def f1(i,j):                    
       return i+j             
       a = np.fromfunction(func,(5,6))             # 第一个参数为指定函数,第二个参数为列表list或元组tuple,说明矩阵的大小             
       print(a)                   
       # 返回             
       [[ 0.  1.  2.  3.  4.  5.]             
        [ 1.  2.  3.  4.  5.  6.]             
        [ 2.  3.  4.  5.  6.  7.]             
        [ 3.  4.  5.  6.  7.  8.]            
        [ 4.  5.  6.  7.  8.  9.]]

三、矩阵运算 (对每个元素的运算)

  1. np.sin(a)-----对矩阵a中的每个元素取正弦, sin(x)
  2. np.cos(a)-----对矩阵a中的每个元素取余弦, cos(x)
  3. np.tan(a)-----对矩阵a中的每个元素取正切, tan(x)
  4. np.arcsin(a)----对矩阵a中的每个元素取反正弦, arsin(x)
  5. np.arccos(a)-----对矩阵a中的每个元素取反余弦, arcos(x)
  6. np.arctan(a)-----对矩阵a中的每个元素取反正切, artan(x)
  7. np.sqrt(a)-------对矩阵a中的每个元素开方, sqrt(x)

四、矩阵元素的填充与矩阵转换

1.fill(n):对矩阵中的每个元素都填写为n

import numpy as np
   m1 = np.ones([3,3],np.uint8)
   m1.fill(122.388)print(m1)
   '''输出结果
   [[ 122.38800049  122.38800049  122.38800049] 
    [ 122.38800049  122.38800049  122.38800049] 
    [ 122.38800049  122.38800049  122.38800049]] 
   若np.float32 改成 np.uint8,则输出结果为 
   [[122 122 122] [122 122 122] [122 122 122]]
   '''

2.reshape([n,m]):将原矩阵变成 n 行 m列的矩阵

import numpy as np
   m1 = np.ones([3,3],np.uint8)
   m1.fill(122.388)
   m2 = m1.reshape([1,9]) #将矩阵变成1行9列的新矩阵
   print(m2)
   #输出结果为:
   [[122 122 122 122 122 122 122 122 122]]

五、利用zeros()方法以及ones()方法创建图像

np.zeros([H,W,N],dtype) :创建一个 H*W 的N通道全0矩阵,dtype为数据类型       
  np.ones([H,W]):创建一个 H*W 的全1矩阵

1.创建一个单通道图像

import cv2
   import numpy as np
   def create_image():    
   '''方法一:利用zero()及ones()函数    
   img = np.zeros([400,400,1],np.uint8)    
   img[:,:,0] = np.ones([400,400]) * 127    
   '''    
   #方法二:直接利用ones()函数    
   img = np.ones([400,400,1],np.uint8)    
   img = img * 127         #乘127得到灰色图像,*0得到黑色图像,*255得到白色图像    
   cv2.imshow("New image",img)    
   print(img)create_image()
   cv2.waitKey(0)
   cv2.destroyAllWindows()

运行结果:

cv2构建mat python cv2 numpy_元组

2.创建一个三通道图像

import cv2
   import numpy as np
   def create_image():    
   img = np.zeros([400,400,3],np.uint8)    
   img[:,:,0] = np.ones([400,400])*255  #0修改第一个通道值使第一个通道值全为255,出现一个蓝色的图片    
   #img[:,:,1] = np.ones([400,400])*255 #1修改第二个通道值,出现一个绿色的图片    
   #img[:,:,2] = np.ones([400,400])*255 #2修改第三个通道值,出现一个红色的图片    
   cv2.imshow("New image",img)    
   print(img)create_image()
   cv2.waitKey(0)
   cv2.destroyAllWindows()

运行结果:

cv2构建mat python cv2 numpy_cv2构建mat python_02