一、实验目的及要求
- 了解numpy库的基本功能
- 掌握Numpy库的对数组的操作与运算
二、实验使用的主要设备(器材、软件系统、原始素材等)
设备:PC
软件:Windows 10,Python3+,Vscode/Pycharm
三、实验操作过程及内容
1.将numpy导入,设置别名为 np,并查看版本号。
import numpy as np
print("版本号为:"+np.__version__)
2.定义一个numpy二维数组,查看该数组的维度,数组元素的个数。
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("数组的维度为:")
print(arr.ndim) # 数组的维度
print("数组元素的个数为:")
print(arr.size) # 数组元素的个数
3.创建一个3×3的所有值为True的数组
arr = np.ones((3,3), dtype=bool)
print(arr)
4.定义一个一维数组arr,每个元素值为10~100的随机整数,从 arr 中提取所有奇数。
arr = np.random.randint(10, 100, size=(5,)) # 创建一维数组
odd_numbers = arr[arr % 2 == 1] # 提取所有奇数
print(arr)
print(odd_numbers)
5. 定义一个随机产生的一维数组arr,获取给定数组a中前5个最大值的位置。
arr = np.random.rand(10) # 随机产生的一维数组
max_indices = np.argsort(arr)[-5:] # 前5个最大值的位置(注意,argsort函数返回的是从小到大的排序,所以取反)
print(arr)
print(max_indices)
6.定义一个随机值的二维数组arr,计算给定数组中每行、每列的最大值。
arr = np.random.rand(5, 5) # 随机值的二维数组
row_max = np.max(arr, axis=1) # 每行最大值
col_max = np.max(arr, axis=0) # 每列最大值
print(arr)
print(row_max)
print(col_max)
7.从一维numpy数组中删除所有为-1的值。
方法一:
arr = np.array([1, -1, 2, -1, 3]) # 一维numpy数组
filtered_arr = arr[arr != -1] # 删除所有为-1的值
print(filtered_arr)
方法二:
# 随机生成一个一维数组
arr = np.random.randint(-10, 10, size=(10,))
print("原始数组:", arr)
# 从数组中删除所有为-1的值
arr = arr[arr != -1]
print("删除-1后的数组:", arr)
首先使用np.random.randint函数生成一个随机整数的一维数组。然后,通过布尔索引来删除数组中所有为-1的值。arr != -1返回一个布尔数组,其中非-1元素的位置为True,然后使用这个布尔数组来选择原始数组中的非-1元素。
8.给定一个n×n的二维矩阵(n为偶数),将该矩阵延中轴线划分为4个相同的矩阵(),返回这4个矩阵,并输出每个矩阵的平均值。
原矩阵:
新矩阵:
方法一:
import numpy as np
def split_matrix(matrix):
print(matrix)
n = matrix.shape[0]
if n % 2 != 0:
raise ValueError("n must be an even number.")
half_n = n // 2
sub_matrices = [matrix[i:i+half_n, j:j+half_n] for i in range(0, n, half_n) for j in range(0, n, half_n)]
avg_sub_matrices = [np.mean(sub_matrix) for sub_matrix in sub_matrices]
return sub_matrices, avg_sub_matrices
def recompose_matrix(avg_sub_matrices, n):
half_n = n // 2
recomposed_matrix = np.zeros((half_n, half_n))
for i in range(half_n):
for j in range(half_n):
recomposed_matrix[i, j] = avg_sub_matrices[i*half_n+j]
return recomposed_matrix
# 测试函数
original_matrix = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
sub_matrices, avg_sub_matrices = split_matrix(original_matrix)
recomposed_matrix = recompose_matrix(avg_sub_matrices, original_matrix.shape[0])
print("Sub-matrices:")
for i in range(len(sub_matrices)):
print(f"Sub-matrix {i+1}:")
print(sub_matrices[i])
print(f"Average: {avg_sub_matrices[i]}\n")
print("Recomposed matrix:")
print(recomposed_matrix)
方法二:
方法2
import numpy as np
def split_matrix(matrix):
n = matrix.shape[0]
if n % 2 != 0:
raise ValueError("n must be an even number.")
half_n = n // 2
sub_matrices = [matrix[i:i+half_n, j:j+half_n] for i in range(0, n, half_n) for j in range(0, n, half_n)]
avg_sub_matrices = [np.mean(sub_matrix) for sub_matrix in sub_matrices]
return sub_matrices, avg_sub_matrices
def test_function(n):
if n % 2 != 0:
raise ValueError("n must be an even number.")
matrix = np.random.rand(n, n)
sub_matrices, avg_sub_matrices = split_matrix(matrix)
avg_matrix = np.array(avg_sub_matrices).reshape(2, 2)
print("Original Matrix:")
print(matrix)
print("Sub-matrices:")
for i in range(len(sub_matrices)):
print(f"Sub-matrix {i+1}:")
print(sub_matrices[i])
print(f"Average: {avg_sub_matrices[i]}\n")
print("Average Matrix:")
print(avg_matrix)
# Example usage:
n = 4 # Input an even number here
test_function(n)
在上面的代码中,split_matrix函数接受一个n×n的矩阵,将其分割成四个相同大小的子矩阵,并计算每个子矩阵的平均值。test_function函数生成一个n×n的随机矩阵,然后调用split_matrix函数进行分割和计算。最后,将四个平均值组成一个2×2的矩阵并输出。
9.通过10X5的二维数组模拟10个学生对应5门课的期末成绩,每门成绩随机从40-100之间产生。
- 找出存在不及格(<60分)课程的学生序号。
- 找出全部成绩都大于70分的学生序号。
- 再定义一个10x5的二维数组模拟10个学生对应5门课的平时成绩,计算所有人每门课的期末综合成绩(平时成绩30% + 期末成绩70%)。
# 模拟10个学生对应5门课的期末成绩
scores = [[random.randint(40, 100) for _ in range(5)] for _ in range(10)]
print("10个学生对应5门课的期末成绩 :")
print(scores)
# 找出存在不及格(<60分)课程的学生序号
failed_students = [i for i, student in enumerate(scores) if any(score < 60 for score in student)]
print("存在不及格课程的学生序号:", failed_students)
# 找出全部成绩都大于70分的学生序号
passed_students = [i for i, student in enumerate(scores) if all(score > 70 for score in student)]
print("全部成绩都大于70分的学生序号:", passed_students)
# 模拟10个学生对应5门课的平时成绩
grades = [[random.randint(40, 100) for _ in range(5)] for _ in range(10)]
# 计算所有人每门课的期末综合成绩(平时成绩×30% + 期末成绩×70%)
comprehensive_scores = [[grade * 0.3 + score * 0.7 for grade, score in zip(grades[i], scores[i])] for i in range(10)]
# 输出每个人的每门课的期末综合成绩
for i, student in enumerate(comprehensive_scores):
print(f"学生{i+1}的期末综合成绩:{student}")
四、实验结论、成果,存在的问题及建议
在上述实验过程中,我遇到了一些问题,比如在创建3x3的所有值为True的数组时,我最初使用了numpy的array函数,但是出现了类型错误。经过调试,我发现在创建所有值为True的数组时不能使用array函数,而应该直接使用True关键字。此外,在提取一维数组arr中的奇数时,我最初尝试使用mod函数来检查余数,但是mod函数不能直接应用于numpy数组。经过研究,我发现numpy数组支持mod运算,但是需要在元素级别上执行,而不是在整个数组上执行。在创建二维数组时,需要注意数组的维度和数据类型。
除此之外,在最后几个较为复杂的题目中,不断进行调试和优化,把庞大的问题划分成一个个小问题来进行解决,最后进行整合,在不断的优化中,也细化的我对知识的掌握,不断调试解决错误也会有很大的成就感,对问题也会有越来越深入的思考,磨练了解决问题的耐心。
在本次实验中,我学习了如何在Python中使用NumPy库来高效地处理大量数值数据。不仅学会了使用NumPy库进行数值计算和数据处理的基本操作,还掌握了一些调试的技巧和阅读文档的方法。