模块2 NumPy数值计算
一.实训目的与要求
1、要求学生掌握Numpy的数组创建及随机数生成;
2、要求学生掌握Numpy中用于统计分析的基本运算函数;
3、要求学生掌握Numpy矩阵创建方法;
4、要求学生掌握Numpy数组索引的方法。
二.实训内容
任务1 创建数组并进行运算
需求说明
Numpy数组在数值运算方面的效率优于Python提供的list,所以灵活掌握Numpy中数组的创建以及基础的运算是有必要的。
2.实现思路及步骤
(1)创建一个数值范围为0~1,间隔为0.01的数组。
(2)创建100个服从正态分布的随机数。
(3)对创建的两个数组进行四则运算。
(4)对创建的随机数组进行简单的统计分析。
#参考代码
#代码test3-1
import numpy as np #导入NumPy库
#创建一个数值范围为0~1,间隔为0.01的数组
arr1=np.arange(0,1,0.01)
print("使用arange函数创建的数组为:\n",arr1)
#练习实训题:创建一个数值范围为10~100,间隔为4.5的数组。输出此数组,并输出第5个元素。
#创建由100个服从正态分布的随机数构成的数组
#arr2=np.random.randn(10,10)
arr2=np.random.randn(100)
# 增加语句: arr2=abs(np.int8(100*arr2)),并观察输出结果
print('生成的随机数组为:\n',arr2)
#对创建的两个数组进行四则运算
arr3=arr1+arr2
print('arr1 + arr2:\n',arr3)
arr4=arr1-arr2
print('arrl-arr2:\n',arr4)
arr5=arr1*arr2
print('arrl*arr2:\n',arr5)
arr6=arr1/arr2
print('arrl/arr2:\n',arr6)
arr7=arr1**arr2
print('arrl**arr2:\n',arr6)
#对创建的数组进行简单的统计分析
arr2.sort()#对数据进行排序
print('排序后的随机数数组为:',arr2)
#去除重复值
print('去重后的正态分布随机数数组为:',np.unique(arr2))
print('正态分布随机数数组的总和为:',np.sum(arr2)) #计算数组总和
#计算所有元素的累计和
print('正态分随机数数组的累计和为:',np.cumsum(arr2))
print('正态分布随机数数组的均值为:',np.mean(arr2)) #计算数组均值
#计算数组标准差
print('正态分布随机数数组的标准差为:',np.std(arr2))
print('正态分布随机数数组的方差为:',np.var(arr2)) #计算数组方差
print('正态分布随机数数组的最小值为:',np.min(arr2)) #计算最小值
print('正态分布随机数数组的最大值为:',np.max(arr2)) #计算最大值
### 3.2
# 代码 2-1
import numpy as np
print(' Hx 整数42转换为浮点数的结果为:', np.float64(42))
print('浮点数42.0转换为整数的结果为:', np.int8(42.0))
print('浮点数42转换为布尔型的结果为:', np.bool(42.0))
print('整数0转换为布尔型的结果为:', np.bool(0))
print('布尔型数据True转换为浮点数的结果为:', np.float(True))
print('布尔型数据False转换为整型的结果为:', np.int8(False))
# 代码 2-2
arr1 = np.array([1, 2, 3, 4])
print('创建的一维ndarray为:', arr1)
arr2 = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
print('创建的二维ndarray为:\n', arr2)
# 代码 2-3
print('ndarray arr2的维数为:', arr2.ndim)
print('ndarray arr2的形状为:', arr2.shape)
print('ndarray arr2的数据类型为:', arr2.dtype)
print('ndarray arr2的元素个数为:', arr2.size)
print('ndarray arr2每个元素的大小为:', arr2.itemsize)
# 代码 2-4
print('使用arange函数创建的ndarray为:\n', np.arange(0, 1, 0.1))
# 代码 2-5
print('使用linspace函数创建的ndarray为:\n', np.linspace(0, 1, 12))
# 代码 2-6
print('使用logspace函数创建的ndarray为:\n', np.logspace(0, 2, 20))
、
# 代码 2-7
print('使用zeros函数创建的ndarray为:\n', np.zeros((2, 3)))
# 代码 2-8
print('使用eye函数创建的ndarray为:\n ', np.eye(3))
# 代码 2-9
print('使用diag函数创建的ndarray为:\n', np.diag([1, 2, 3, 4]))
# 代码 2-10
print('使用ones函数的ndarray为:\n', np.ones((2, 3)))
# 代码 2-11
print('random函数生成的随机数ndarray为:\n', np.random.random(100))
# 代码 2-12
print('rand函数生成的服从均匀分布的随机数ndarray为:\n', np.random.rand(4, 5))
# 代码 2-13
print('randint函数生成的指定上下限的随机整数ndarray为:\n',
np.random.randint(low=2, high=10, size=[2, 5]))
# 代码 2-14
arr = np.arange(10)
print('使用元素位置索引结果为:', arr[5])
print('使用元素位置切片结果为:', arr[3:5])
print('省略单个位置切片结果为:', arr[:5])
print('使用元素反向位置切片结果为:', arr[:-1])
arr[2:4] = 100, 101 # 修改对应下标的值
print('修改后的ndarrayarr为:', arr)
print('元素位置等差索引结果为:', arr[1:-1:2])
# 步长为负数时,开始位置必须大于结束位置
print('元素位置负数步长等差索引结果为:', arr[5:1:-2])
# 代码 2-15
arr = np.array([[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11]])
print('创建的二维ndarray arr为:\n', arr)
print('切片结果为:', arr[0, 3:5]) # 访问第0行中第3和第4列的元素
print('切片结果为:\n', arr[1:, 2:]) # 访问第1和第2行中第2列、第3列和第4列的元素
print('切片结果为:\n', arr[:, 2]) # 访问第3列所有的元素
# 代码 2-16
# 索引第1、3行中第2列的元素
mask = np.array([1, 0, 1], dtype=np.bool)
print('使用布尔值ndarray索引结果为:', arr[mask, 2])
# 代码 2-17
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
print('创建的二维ndarray arr为:\n', arr)
print('以特定顺序索引arr结果为:\n', arr[[4, 3, 0, 6]])
print('以特定逆序索引arr结果为:\n', arr[[-3, -5, -7]])
# 代码 2-18
arr = np.array([np.arange(i*4, i*4+4) for i in np.arange(6)])
print('创建的二维ndarray arr为:\n', arr)
# 返回一个ndarray最终的元素(1,0)、(5,3)、(4,1)、(2,2)
print('使用二维ndarray索引arr结果为:', arr[[1, 5, 4, 2], [0, 3, 1, 2]])
# 代码 2-19
# 利用ix函数将两个一维的整数ndarray转化为方形区域的索引器
print('使用ix成片索引arr结果为:\n', arr[np.ix_([1, 5, 4, 2], [0, 3, 1, 2])])
### 3.2
# 代码 2-20
import numpy as np
arr = np.arange(12) # 创建一维ndarray
print('创建的一维ndarray arr为:', arr)
arr1 = arr.reshape(3, 4) # 设置ndarray的维度
print('改变形状后的ndarray arr1为:\n', arr1)
print('形状改变后ndarray arr1的维度为:', arr1.ndim)
# 代码 2-21
arr.resize(2, 6)
print('resize改变原ndarray形状,ndarray arr变为:\n', arr)
# 代码 2-22
arr.shape = (4, 3)
print('通过重新设置shape属性后,ndarray arr为:\n', arr)
# 代码 2-23
arr = np.arange(12).reshape(3, 4)
print('创建的二维ndarray arr为:\n', arr)
print('ndarray arr横向展平后为:', arr.ravel())
# 代码 2-24
print('ndarray arr使用flatten方法横向展平后为:', arr.flatten())
print('ndarray arr使用flatten方法纵向展平后为:', arr.flatten('F'))
# 代码 2-25
arr1 = np.arange(12).reshape(3, 4)
print('创建的ndarray arr1为:\n', arr1)
arr2 = arr1*3
print('创建的ndarray arr2为:\n', arr2)
print('hstack横向组合ndarray arr1与arr2为:\n', np.hstack((arr1, arr2)))
# 代码 2-26
print('vstack纵向组合ndarray arr1与arr2为:\n', np.vstack((arr1, arr2)))
# 代码 2-27
print('concatenate横向组合arr1与arr2为:\n', np.concatenate((arr1, arr2), axis=1))
print('concatenate纵向组合arr1与arr2为:\n', np.concatenate((arr1, arr2), axis=0))
# 代码 2-28
print('dstack深度组合arr1与arr2为:\n', np.dstack((arr1, arr2)))
arr3 = []
for x, y in list(zip(arr1, arr2)):
arr3.append(list(zip(x, y)))
arr3 = np.array(arr3)
print('zip函数实现深度合并的arr3与dstack实现的等价:\n',
arr3 == np.dstack((arr1, arr2)))
# 代码 2-29
arr = np.arange(16).reshape(4, 4)
print('创建的二维ndarray arr为:\n', arr)
print('hsplit横向分割arr为:\n', np.hsplit(arr, 2))
# 代码 2-30
print('hsplit纵向分割arr为:\n', np.vsplit(arr, 2))
# 代码 2-31
print('split横向分割arr为:\n', np.split(arr, 2, axis=1))
print('split纵向分割arr为:\n', np.split(arr, 2, axis=0))
# 代码 2-32
arr = np.arange(12).reshape(2, 2, 3)
print('创建的三维ndarray arr为:\n', arr)
print('dsplit深度分割arr为:\n', np.dsplit(arr, 3))
# 代码 2-33
np.random.seed(42) # 设置随机种子
arr = np.random.randint(1, 10, size=12).reshape(4, 3)
print('创建的随机数ndarray arr为:\n', arr)
print('默认排序后ndarray arr为:\n', np.sort(arr))
print('展平排序的ndarray arr为:', np.sort(arr, axis=None))
print('横轴排序后ndarray arr为:\n', np.sort(arr, axis=1))
print('纵轴排序后ndarray arr为:\n', np.sort(arr, axis=0))
# 代码 2-34
print('横轴排序后arr的下标为:\n', np.argsort(arr, axis=1))
print('展平排序后arr的下标为:', np.argsort(arr, axis=None))
# 代码 2-35
arr = np.arange(6, 12).reshape(2, 3)
print('创建的ndarray arr为:\n', arr)
print('ndarray arr中最大元素的索引为:', np.argmax(arr))
print('ndarray arr中最小元素的索引为:', np.argmin(arr))
print('ndarray arr中各列最大元素的索引为:', np.argmax(arr, axis=0))
print('ndarray arr中各行最小元素的索引为:', np.argmin(arr, axis=1))
# 代码 2-36
arr = np.arange(12).reshape(4, 3)
print('创建的ndarray arr为:\n', arr)
print('where输出ndarray arr满足条件的下标为:\n', np.where(arr > 6))
# 代码 2-37
arr1 = np.arange(12).reshape(3, 4)
print('创建的ndarray arr1为:\n', arr1)
arr2 = np.arange(-12, 0).reshape(3, 4)
print('创建的ndarray arr2为:\n', arr2)
exp = arr1 > 5
print('arr1大于5的布尔ndarray为:\n', exp)
print('where函数搜索符合条件的arr1与arr2为:\n', np.where(exp, arr1, arr2))
# 代码 2-38
arr = np.arange(9).reshape(3, 3)
print('创建的ndarray arr为:\n', arr)
exp = (arr % 2) == 0
print('arr能被2整除的布尔ndarray为:\n', exp)
print('arr基于条件exp提取的元素为:\n', np.extract(exp, arr))
### 3.3
# 代码 2-39
import numpy as np
arr1 = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
print('创建的ndarray arr为:\n', arr1)
arr2 = np.array([1, 2, 3])
print('创建的ndarray arr2为:', arr2)
print('arr1与arr2相加结果为:\n', arr1 + arr2)
# 代码 2-40
arr3 = np.arange(1, 5).reshape(4, 1)
print('创建的ndarray arr3为:\n', arr3)
print('arr1与arr3相加结果为:\n', arr1 + arr3)
# 代码 2-41
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print('ndarray arr1,arr2相加结果为:', arr1+arr2)
print('ndarray arr1,arr2相减结果为:', arr1-arr2)
print('ndarray arr1,arr2相乘结果为:', arr1*arr2)
print('ndarray arr1,arr2相除结果为:', arr1/arr2)
print('ndarray arr1,arr2幂运算结果为:', arr1**arr2)
# 代码 2-42
arr = np.arange(-4, 5).reshape(3, 3)
print('创建的ndarray arr为:\n', arr)
print('ndarray arr各元素的相反数为:\n', np.negative(arr))
print('ndarray arr各元素的绝对值为:\n', np.absolute(arr))
print('ndarray arr各元素的符号为:\n', np.sign(arr))
print('ndarray arr各元素的平方根为:\n', np.sqrt(arr))
print('ndarray arr各元素的自然对数为:\n', np.log1p(arr))
# 代码 2-43
rad = np.array([0, np.pi*1/6, np.pi*1/4, np.pi*1*3, np.pi*1/2])
print('将弧度制ndarray rad转换为角度制后为:', np.rad2deg(rad))
print('ndarray rad各元素的正切为:\n ', np.tan(rad))
print('ndarray rad各元素的正弦为:\n ', np.sin(rad))
print('ndarray rad各元素的余弦为:\n ', np.cos(rad))
arr = np.array([0, 1/2, np.sqrt(2)/2, np.sqrt(3)/2, 1])
print('ndarray arr各元素的三角反正弦为:\n ', np.arcsin(arr))
print('通过直角边3,4求出的斜边为:\n', np.hypot(3, 4))
# 代码 2-44
arr1 = np.arange(-4, 5)
print('创建的ndarray arr1为:', arr1)
arr2 = np.arange(9)
print('创建的ndarray arr2为:', arr2)
print('ndarray arr1与arr2的交集为:', np.intersect1d(arr1, arr2))
print('ndarray arr1与arr2的并集为:', np.union1d(arr1, arr2))
print('ndarray arr1与arr2的差集为:', np.setdiff1d(arr1, arr2))
print('ndarray arr1与arr2的对称差集为:', np.setxor1d(arr1, arr2))
# 代码 2-45
arr1 = np.array([1, 3, 5])
arr2 = np.array([2, 3, 4])
print('ndarray x等于y的比较结果为:', arr1 == arr2, np.equal(arr1, arr2))
print('ndarray x不等于y的比较结果为:', arr1 != arr2, np.not_equal(arr1, arr2))
print('ndarray x小于y的比较结果为:', arr1 < arr2, np.less(arr1, arr2))
print('ndarray x大于y的比较结果为:', arr1 > arr2, np.greater(arr1, arr2))
# 代码 2-46
arr1 = [True, True, False, False, False]
print('创建的ndarray arr1为:', arr1)
arr2 = [True, False, True, False, True]
print('创建的ndarray arr2为:', arr2)
print('ndarray arr1与arr2的逻辑与运算结果为:', np.logical_and(arr1, arr2))
print('ndarray arr1与arr2的逻辑或运算结果为:', np.logical_or(arr1, arr2))
print('ndarray arr1的逻辑非运算结果为:', np.logical_not(arr1))
print('ndarray arr1与arr2的逻辑异或运算结果为:', np.logical_xor(arr1, arr2))
# 代码 2-47
arr = np.arange(20).reshape(4, 5)
print('创建的ndarray arr为:\n', arr)
print('ndarray arr各元素的和为:', np.sum(arr))
print('ndarray arr各行的极差为:', np.ptp(arr, axis=1))
print('ndarray arr各列的均值为:', np.mean(arr, axis=0))
print('ndarray arr的中位数为:', np.median(arr))
print('ndarray arr各行的上四分位数为:', np.percentile(arr, 75, axis=1))
print('ndarray arr各列的下四分位数为:', np.percentile(arr, 25, axis=0))
print('ndarray arr的标准差为:', np.std(arr))
print('ndarray arr的方差为:', np.var(arr))
print('ndarray arr的最小值为:', np.min(arr))
print('ndarray arr的最大值为:', np.max(arr))
# 代码 2-48
arr = np.arange(1, 11)
print('创建的ndarray arr为:', arr)
print('ndarray arr的元素累计和为:', np.cumsum(arr))
print('ndarray arr的元素累计积为:\n', np.cumprod(arr))
上机实训资源包