大数据分析与可视化 之 实验02 Numpy创建数组

发布时间 2023-12-30 19:50:14作者: Ivan丶c

实验02 Numpy创建数组

实验学时:2学时
实验类型:验证
实验要求:必修
一、实验目的

  1. 掌握Numpy创建数组的方法
  2. 掌握Numpy ndarray的属性、运算
  3. 掌握Numpy迭代数值,修改数组中元素的值
  4. 掌握Numpy常用函数的使用方法
    二、实验要求
    使用Numpy.array的构造函数创建数组,学会使用Numpy ndarray的属性、运算,掌握Numpy迭代数值,修改数组中元素的值等常用操作。
    三、实验内容
    任务1. (1)创建一个元素为10到50的10个随机整数的ndarray对象。
    (2)创建一个范围在(0,1)之间的长度为6的等差数列。
    用Python与第三方库numpy编写程序实现。

任务2. (1)创建一个每一行都是从0到4的55矩阵。
(2)创建一个8
8的ndarray对象,且矩阵边界全为5,里面主对角线为1,其余为0的矩阵。
(3)创建一个平均值为70,标准差为5的43个同学的Python语言程序设计成绩的随机分数。
用Python与第三方库numpy编写程序实现。

任务3. (1)为43个同学随机生成5门课程的成绩(分数在1~100之间)。
(2)求第2门课程的平均分(mean函数)和第8个同学的总分(sum函数)。
(3)统计第3门课程不及格的人数(len函数)。
用Python与第三方库numpy编写程序实现。

任务4. 某人走了2000步(每步0.5米),向前走了一步记为1,向后走一步记为-1,当计算距原点的距离时,就是将所有的步数进行累计求和。用Python与第三方库numpy编写程序实现。

任务5. 从一个10行10列的矩阵中提取出连续的3行3列区块。用Python与第三方库numpy编写程序实现。(提示:使用np.lib.stride_tricks.as_strided()是矩阵分块函数)

任务6. 绘制曼德勃罗花。用Python与第三方库numpy编写程序实现。
image

参考源代码:
image

课外练习:
任务7. 一万人参与厦门市政府组织的万人博饼庆中秋活动,每人只能博一次。用numpy分析博得状元的概率。用Python与第三方库numpy编写程序实现。

test2.py

import numpy as np
import matplotlib.pyplot as plt


def task1():
    # 创建一个元素为10到50的10个随机整数的ndarray对象
    arr1 = np.random.randint(10, 51, 10)

    # 创建一个范围在(0,1)之间的长度为6的等差数列
    arr2 = np.linspace(0, 1, 6)

    print("随机整数数组:", arr1)
    print("等差数列数组:", arr2)


def task2():
    # 创建一个每一行都是从0到4的5*5矩阵
    matrix1 = np.tile(np.arange(5), (5, 1))

    # 创建一个8*8的ndarray对象,且矩阵边界全为5,里面主对角线为1,其余为0的矩阵
    matrix2 = np.zeros((8, 8))
    matrix2[0, :] = matrix2[:, 0] = matrix2[-1, :] = matrix2[:, -1] = 5
    np.fill_diagonal(matrix2, 1)

    # 创建一个平均值为70,标准差为5的43个同学的Python语言程序设计成绩的随机分数
    scores = np.random.normal(70, 5, 43)

    print("矩阵1:\n", matrix1)
    print("矩阵2:\n", matrix2)
    print("随机分数:", scores)


def task3():
    # 为43个同学随机生成5门课程的成绩(分数在1~100之间)
    np.random.seed(0)
    grades = np.random.randint(1, 101, (43, 5))

    # 求第2门课程的平均分和第8个同学的总分
    mean_grade = np.mean(grades[:, 1])
    total_grade = np.sum(grades[7, :])

    # 统计第3门课程不及格的人数
    failed_count = len(grades[grades[:, 2] < 60])

    print("成绩矩阵:\n", grades)
    print("第2门课程的平均分:", mean_grade)
    print("第8个同学的总分:", total_grade)
    print("第3门课程不及格的人数:", failed_count)


def task4():
    steps = np.array([1, -1])
    walk = np.random.choice(steps, 2000)
    distance = np.sum(walk) * 0.5

    print("距离原点的距离:", distance)


def task5():
    # 创建一个10行10列的矩阵
    matrix = np.arange(100).reshape(10, 10)

    # 提取连续的3行3列区块
    blocks = np.lib.stride_tricks.as_strided(matrix, shape=(8, 8, 3, 3), strides=matrix.strides + matrix.strides)

    print("矩阵:\n", matrix)
    print("连续的3行3列区块:\n", blocks)


def task6():
    def mandelbrot(c, max_iter):
        z = c
        for i in range(max_iter):
            if abs(z) > 2:
                return i
            z = z * z + c
        return max_iter

    def mandelbrot_set(xmin, xmax, ymin, ymax, width, height, max_iter):
        r1 = np.linspace(xmin, xmax, width)
        r2 = np.linspace(ymin, ymax, height)
        return (r1, r2, np.array([[mandelbrot(complex(r, i), max_iter) for r in r1] for i in r2]))

    # 设置绘图参数
    xmin, xmax, ymin, ymax = -2.0, 1.0, -1.5, 1.5
    width, height = 1000, 1000
    max_iter = 256

    # 生成曼德勃罗集合数据
    x, y, m_set = mandelbrot_set(xmin, xmax, ymin, ymax, width, height, max_iter)

    # 绘制曼德勃罗花图像
    plt.figure(figsize=(10, 10))
    plt.imshow(m_set.T, extent=(xmin, xmax, ymin, ymax), cmap='hot')
    plt.xlabel('Re')
    plt.ylabel('Im')
    plt.title('Mandelbrot Set')
    plt.show()


def task7():
    np.random.seed(0)

    # 模拟一万人的博饼结果
    rolls = np.random.choice(6, (10000, 4)) + 1

    # 计算每一次博饼是否获得状元
    is_champion = np.sum(rolls == 6, axis=1) == 4

    # 计算获得状元的概率
    champion_probability = np.mean(is_champion)

    print("获得状元的概率:", champion_probability)


if __name__ == '__main__':
    task1()
    task2()
    task3()
    task4()
    task5()
    task6()
    task7()