NumPy(Numerical Python)可以将图像、声音、文本等数字化。
张量(Tensor)与NumPy可以互相转换。
NumPy提供了两种基本对象:ndarray(n-dimensional array object, 多维数组对象)和ufunc(universal function object,通用函数对象)。
ndarray是存储单一数据类型的多维数组,ufunc为数组处理提供了丰富的函数。
生成NumPy数组
查看np库中的内容:
按Ctrl键,同时鼠标左键点击函数名称,即可跳转到官方的权威解释。
或者
dir(函数名称):该函数中有什么东西可以使用(注:函数名称不需要加括号)
help(函数名称):该函数的具体使用方法(注:函数名称不需要加括号)
生成ndarray的几种方式:利用已有数据生成,利用random模块生成,生成特定形状的多维数组,使用arrange函数生成等。
在机器学习中,图像、自然语言、语音等内容在输入模型之前都是需要数字化的。
实操:
打开PyCharm底部的Terminal窗口并进入对应的环境:
dir()和help()的使用:
使用cv2(OpenCV 2)把一个汽车图像转换为NumPy多维数组,并查看该多维数组的基本属性:
# 使用OpenCV开源库读取图像数据
import cv2
from matplotlib import pyplot as plt
# %matplotlib inline # 是IPython的内置magic函数,Pycharm中是不支持,可以直接注释掉
# 读取一张照片,把图像转换为二维的NumPy数组
img = cv2.imread('./data/car.jpg')
# 使用plt显示图像
plt.imshow(img) # 对图片image只做数据处理
plt.show() # 显示图片,在PyCharm中加该行
# 显示img的数据类型及大小
print("数据类型:{},形状:{}".format(type(img), img.shape))
运行结果:
显示图片:
报错:
解决:
数组的属性:
ndarray.ndim:数组的维度(轴)的个数。
ndarray.shape:数组的维度,一个整数元组,值代表所对应的轴的长度。
类比二维数组:(二维数组的个数,二维数组的行数,二维数组的列数)
ndarray.dtype:数组中数据元素的数据类型。
print("-----------数组属性------------")
print("img数组的维度:", img.ndim)
print("img数组的形状:", img.shape)
print("img数组的数据类型:", img.dtype)
print("------------------------------")
print("img数组的维度:{}".format(img.ndim))
print("img数组的形状:{}".format(img.shape))
print("img数组的数据类型:{}".format(img.dtype))
运行结果:
利用已有数据(如列表、元组等)生成数组
import numpy as np
print("---使用一维列表生成数组---")
list1 = [3.14, 2.17, 0, 1, 2]
nd1 = np.array(list1)
print(nd1)
print(type(nd1))
print("---使用二维列表生成数组---")
list2 = [[3.14, 2.17, 0, 1, 2], [1, 2, 3, 4, 5]]
nd2 = np.array(list2)
print(nd2)
print(type(nd2))
print("---使用一维元组生成数组---")
list1 = (3.14, 2.17, 0, 1, 2)
nd1 = np.array(list1)
print(nd1)
print(type(nd1))
print("---使用二维元组生成数组---")
list2 = ((3.14, 2.17, 0, 1, 2), (1, 2, 3, 4, 5))
nd2 = np.array(list2)
print(nd2)
print(type(nd2))
运行结果:
利用random模块生成数组
np.random.random:生成从0到1之间的随机数
np.random.uniform:生成均匀分布的随机数
np.random.randn:生成标准正态分布的随机数(n:normal)
np.random.randint:生成随机的整数
import numpy as np
print('生成形状(4,4),值在0-1之间的随机数:')
print(np.random.random((4, 4)), end='\n\n') # end='\n\n':两次换行,隔行打印
# 产生一个取值范围在[1, 50)之间的数组,数组的形状是(3, 3)
# 参数的起始值(low)默认为0,终止值(high)默认为1
print('生成形状(3, 3),值在low到high之间的随机整数:')
print(np.random.randint(low=1, high=50, size=(3, 3)), end='\n\n')
print('产生的数组元素是均匀分布的随机数:')
print(np.random.uniform(low=1, high=3, size=(3, 3)), end='\n\n')
print('生成满足正态分布的形状为(3, 3)的矩阵:')
print(np.random.randn(3, 3))
运行结果:
多次生成同一份数据:
import numpy as np
np.random.seed(10)
print('按指定随机种子,第1次生成随机数:')
print(np.random.randint(1, 5, (2, 3)), end='\n\n')
print('第2次生成随机数:')
print(np.random.randint(1, 5, (2, 3)))
运行结果:
np.random.seed():设置随机数种子
import numpy as np
np.random.seed(10)
print('按指定随机种子,第1次生成随机数:')
print(np.random.randint(1, 5, (2, 3)), end='\n\n')
# 想要生成同样的数组,必须再次设置相同的种子
np.random.seed(10)
print('按相同随机种子,第2次生成随机数:')
print(np.random.randint(1, 5, (2, 3)))
运行结果:
生成特定形状的多维数组(特殊矩阵)
np.zeros((3, 4)):生成3×4的数组,元素全为0
np.zeros((3, 4)):生成3×4的数组,元素全为1
np.empty((2, 3)):生成2×3的空数组,空数组值并不为0,而是未初始化的随机值。
np.zeros_like(ndarr):以ndarr相同维度生成元素全为0的数组
np.ones_like(ndarr):以ndarr相同维度生成元素全为1的数组
np.empty_like(ndarr):以ndarr相同维度生成空数组
np.eye(5):该函数用于生成5×5的矩阵(单位矩阵),对角线为1, 其余为0
np.full((3, 5), 666):生成3×5的数组,元素全为666(666为指定值)
import numpy as np
# 生成全是0的3×3矩阵
np1 = np.zeros((3, 4)) # 元组定义形状
np2 = np.zeros([3, 4]) # 列表定义形状
# 生成与np1形状一样的全0矩阵
np3 = np.zeros_like(np1)
# 生成全是1的3×3矩阵
np4 = np.ones((3, 3))
# 生成4阶的单位矩阵
np5 = np.eye(4) # 平时写单位矩阵都用大写I来表示,用eye则为I的谐音
# 生成3阶对角矩阵
np6 = np.diag([1, 2, 5]) # diagonal:对角线
np7 = np.empty((3, 3))
print("*"*6+"np1"+"*"*6)
print(np1)
print("*"*6+"np2"+"*"*6)
print(np2)
print("*"*6+"np3"+"*"*6)
print(np3)
print("*"*6+"np4"+"*"*6)
print(np4)
print("*"*6+"np5"+"*"*6)
print(np5)
print("*"*6+"np6"+"*"*6)
print(np6)
print("*"*6+"np7"+"*"*6)
print(np7)
运行结果:
保存和加载生成的数据:
import numpy as np
nd8 = np.random.random((5, 5))
print("*"*27+"nd8"+"*"*27)
print(nd8)
np.savetxt(fname='./test1.txt', X=nd8) # 以文本形式保存到指定位置
nd9 = np.loadtxt(fname='./test1.txt') # 以文本形式加载
print("*"*27+"nd9"+"*"*27)
print(nd9)
运行结果:
注:
利用arange、linspace函数生成数组(特定规律)
import numpy as np
# np.arange():[start, stop) 左闭右开 步长step
print(np.arange(10))
print(np.arange(0, 10))
print(np.arange(1, 4, 0.5))
print(np.arange(9, -1, -1))
运行结果:
import numpy as np
# np.linspace():[start, stop] 左闭右闭 个数
print(np.linspace(0, 1, 10))
# 1 2 3 4 5 左闭右闭,共5个数,但5-1=4,num也需要减1 (1-0)/ (10-1)=0.111111
print("*"*90)
print(np.linspace(0, 1, 10, retstep=True)) # 输出步长
print("*"*90)
print(np.linspace(0, 1, 10, endpoint=False, retstep=True)) # 不包含最后一个值,输出步长
# 1 2 3 4 5 左闭右开,共4个数,5-1=4,num不需要减1 (1-0)/ 10=0.1
print("*"*90)
print(np.linspace(0.1, 1, 10))
# 1 2 3 4 5 左闭右闭,共5个数,但5-1=4,num也需要减1 (1-0.1)/ (10-1)=0.1
运行结果:
logspace()函数生成特定规律的数据
import numpy as np
print("*"*90)
print(np.logspace(0, 1, 10, base=2)) # 2^1 - 2^0 = 1 1/9
# 对数函数,base:基, log以2为底x=0, x=1 log以2为底x=1, x=2
print("*"*90)
print(np.linspace(1, 2, 10)) # 1 2 共2个数,左闭右闭,但2-1=1,num-1 1/9=0.11111
运行结果: