0
点赞
收藏
分享

微信扫一扫

NumPy基础知识-新手

NumPy(Numerical Python)可以将图像、声音、文本等数字化。

NumPy基础知识-新手_数组

张量(Tensor)与NumPy可以互相转换。

NumPy提供了两种基本对象:ndarray(n-dimensional array object, 多维数组对象)和ufunc(universal function object,通用函数对象)。

NumPy基础知识-新手_NumPy_02

ndarray是存储单一数据类型的多维数组,ufunc为数组处理提供了丰富的函数。

生成NumPy数组

查看np库中的内容:

按Ctrl键,同时鼠标左键点击函数名称,即可跳转到官方的权威解释。

或者

dir(函数名称):该函数中有什么东西可以使用(注:函数名称不需要加括号

help(函数名称):该函数的具体使用方法(注:函数名称不需要加括号

生成ndarray的几种方式:利用已有数据生成,利用random模块生成,生成特定形状的多维数组,使用arrange函数生成等。

在机器学习中,图像、自然语言、语音等内容在输入模型之前都是需要数字化的。

实操:

打开PyCharm底部的Terminal窗口并进入对应的环境:

NumPy基础知识-新手_数组_03

dir()和help()的使用:

NumPy基础知识-新手_NumPy_04

NumPy基础知识-新手_随机数_05

使用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))

运行结果:

NumPy基础知识-新手_随机数_06

显示图片:

NumPy基础知识-新手_数组_07

报错:

NumPy基础知识-新手_随机数_08

解决:

NumPy基础知识-新手_NumPy_09

数组的属性:

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))

运行结果:

NumPy基础知识-新手_随机数_10

利用已有数据(如列表、元组等)生成数组

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))

运行结果:

NumPy基础知识-新手_随机数_11

利用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)))

运行结果:

NumPy基础知识-新手_NumPy_12

生成特定形状的多维数组(特殊矩阵)

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)

运行结果:

NumPy基础知识-新手_数组_13

NumPy基础知识-新手_NumPy_14

保存和加载生成的数据:

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()函数生成特定规律的数据

NumPy基础知识-新手_NumPy_15


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

运行结果:

NumPy基础知识-新手_NumPy_16
























举报

相关推荐

0 条评论