湖南大学python头歌实训 实验12:数据思维(二)

蒙特卡罗应用

第1关:蒙特卡洛方法求定积分一

import numpy as np
#将积分函数f定义成匿名函数
###########begin############
f = lambda x: x/25 + 0.2

###########end##############
#在一行输入积分区间【a,b】和实验点数n,用空格分隔
##################begin###############
a,b,n = [eval(i) for i in input().split()]

###################end################
#矩形区域为:[a,b,fmin,fmax],矩形面积=(b-a)*(fmax-fim)
fmin=0
fmax=f(b)
np.random.seed(0)
#利用均匀分布产生n个在【a,b】中的随机数x
#利用均匀分布产生n个在【fmin,fmax】中的随机数y
#################begin##################

x = np.random.uniform(a,b,n)
y = np.random.uniform(fmin,fmax,n)
##################end##################
#统计落在y<f(x)内的点数
p= y[ (y>0) & (y < f(x))].size  
#积分面积为y<f(x)内点数除以总实验点数再乘以矩形面积
##############begin################
jf = p/n*(fmax-fmin)*(b-a)

#################end###############
print("%.5f"%jf)

第2关:蒙特卡罗方法求定积分二

import numpy as np
#定义积分函数f(x)
##################begin####################
f = lambda x: 3*x**2 + 4*np.cos(x) - 4*x*np.sin(x)

##################end#######################
#定义求积分值的函数
def jifen(f, a, b, n, fmin,fmax):
    #f表示积分函数
    #a,b表示积分区间
    #n表示总实验点数
    #fmin,fmax矩形区域纵向最小和最大值
    ##################begin#################
    x = np.random.uniform(a,b,n)
    y = np.random.uniform(fmin,fmax,n)
    p = 0
    p += y[(y>0) & (y<f(x))].size
    p -= y[(y<0) & (y<f(x))].size

    return p/n*(b-a)*(fmax-fmin)
    ###################end###################
np.random.seed(17)
n=int(input())
fmin=0
fmax=f(15)
z=jifen(f, 10,15, n, fmin,fmax)
print("{0:.4f}".format(z))

第3关:蒙特卡洛方法求圆周率

'''求x**2+y**2=1在【-1,1】中的积分
即求y=np.sqrt(1-x**2)在【-1,1】中积分
即求上半圆的面积,np.pi*1**2/2
利用该积分得到的面积可以求出圆周率'''
import numpy as np
#定义积分函数f(x)
#########begin###############
f = lambda x: (1-x**2)**0.5


###########end################

def jifen(f, a, b, n, fmin,fmax):
    #f表示积分函数
    #a,b表示积分区间,矩形区域横向值
    #n表示总实验点数
    #fmin,fmax矩形区域纵向最小和最大值
    #利用均匀分布产生n个在【a,b】中的随机数x
    #利用均匀分布产生n个在【fmin,fmax】中的随机数y
    ############begin#############
    x = np.random.uniform(a,b,n)
    y = np.random.uniform(fmin,fmax,n)
    
    
    ##############end##############
    #统计落在f(x)内的点数
    p= y[ (y>0) & (y < f(x))].size  
    #积分面积为f(x)内点数除以总实验点数再乘以矩形面积
    ###########begin################
    
    jf = p/n*(b-a)*(fmax-fmin)
    ###########end##################
    return jf
np.random.seed(11)
n=int(input())
#调用自定函数求f(x)在【0,1】中积分
#############begin#############
z =jifen(f, 0,1, n, 0,1)

#############end###############
#调用自定函数求f(x)在【-1,0】中积分
z1=jifen(f, -1,0, n, 0,1)
w=z+z1   #上半圆的面积,半径为1,即圆周率的一半
print("{0:.4f}".format(w*2))

Numpy图像处理

第1关:图像翻转

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

# 载入图片并转成numpy数组
im = np.array(Image.open('image/panda.png'))
im = im / 255  # 转到定义域[0,1]

# 1. 水平翻转图片,保存到图片文件filename中
def Turn_1(filename):

    im1 = (im[:, ::-1, :] * 255).astype(np.uint8)
    Image.fromarray(im1).save(filename)

# 2. 180度翻转图片,保存到图片文件filename中
def Turn_2(filename):

    im2 = (im[::-1, ::-1, :] * 255).astype(np.uint8)
    Image.fromarray(im2).save(filename)


第2关:图像伽玛转换

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

# 载入图片并转成numpy数组
im = np.array(Image.open('image/panda.png'))  
im = im / 255  # 转到定义域[0,1]

# 1. 提高对比度,Gamma值设为0.4,保存到图片文件filename中
def gammaTrans_1(filename):
    # 代码开始
    im1 = ((im ** 0.4)*255).astype(np.uint8) # 提高对比 
    Image.fromarray(im1).save(filename)


# 2. 降低对比度,Gamma值设为4,保存到图片文件filename中
def gammaTrans_2(filename):
    # 代码开始
    
    im2 = ((im ** 4)*255).astype(np.uint8) # 提高对比 
    Image.fromarray(im2).save(filename)

第3关:图像背景颜色改变

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
 
#载入图片并转成numpy数组
im = np.array(Image.open('image_2/doraemon.webp'))  
 
#修改背景颜色,保存到图片文件filename中
#背景颜色蓝色(RGB值之和在大于350小于460之间),修改为橙色(RGB的值为[255,165,0])
def Background_change(filename):
    #代码开始
    im2=im.copy()
    for i in im2:
        x=np.where((np.sum(i,axis=1)>=460)|(np.sum(i,axis=1)<=350))[0]
        if len(x)==0:
            i[:]=[255,165,0]
        else:
            i[:x[0]]=i[x[-1]:]=[255,165,0]
    # plt.imshow(im2)
    Image.fromarray(im2).save(filename)
    #代码结束

最小二乘法求线性回归方程

第1关:numpy计算

 #全部都交给你了,我只要结果
 #Student satrt
import numpy as np

data = [[1, 19.531], [2, 21.719], [3, 22.308], [4, 18.871], [5, 21.107], [6, 25.469], [7, 27.042], [8, 26.827], [9, 27.778], [10, 22.642], [11, 22.309], [12, 26.73], [13, 29.388], [14, 18.519], [15, 23.375], [16, 23.872], [17, 21.259], [18, 22.491], [19, 29.017], [20, 23.483]]

# 转换为 numpy 数组
array = np.array(data)

# 输出数组
print(array)

# data = [[19.531,115], [21.719,122], [22.308,125], [18.871,112], [21.107,61], [6, 25.469], [7, 27.042], [8, 26.827], [9, 27.778], [10, 22.642], [11, 22.309], [12, 26.73], [13, 29.388], [14, 18.519], [15, 23.375], [16, 23.872], [17, 21.259], [18, 22.491], [19, 29.017], [20, 23.483]]
 #Student end

md,出题老师真的狗,浪费时间么这不是?

第2关:最小二乘线性回归

import numpy as np
newsample = eval(input())
#Student Start 
w,h = newsample
bmi_new = w/(h/100)**2

bmi = [19.531 ,21.719 ,22.308 ,18.871 ,21.107 ,25.469 ,27.042 ,26.827 ,27.778 ,22.642 ,22.309 ,26.73  ,29.388 ,18.519 ,23.375 ,23.872 ,21.259 ,22.491 ,29.017 ,23.483]
ssy = [115,122,125,112,120,140,150,145,152,126,125,143,160,110,130,132,121,126,158,131]

x = np.array(bmi)
y =np.array(ssy)

mx = np.mean(x)
my = np.mean(y)
sx = np.std(x)
sy = np.std(y)
n = len(x)
r = 1/(n-1)*np.sum((x-mx)/sx*(y-my)/sy)
a = r*sy/sx
b = my-a*mx


y_predict = a*bmi_new+b
print(f"{y_predict:.3f}")
#Student End

总结:

这些期末只会出现在选择题,能读懂就行了!~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值