python练习之Numpy的使用

一、实验目的及要求

  1. 了解numpy库的基本功能
  2. 掌握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库进行数值计算和数据处理的基本操作,还掌握了一些调试的技巧和阅读文档的方法。

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值