七夕节来用python表白吧!爱情病毒浸染你的心!

七夕节到了,快用python来表白吧!

参考了把数据摇起来!用Python制作动画可视化效果!模拟僵尸病毒在法国蔓延的动态图。稍微做了修改,改了一个爱情病毒蔓延的动态图/小视频。同样moviepy还可以加音乐等,有兴趣可以参考MoviePy中文手册,一起来试试吧!
在这里插入图片描述

代码如下

#fullheart
import urllib.request
import numpy as np
from scipy.ndimage.filters import convolve
import moviepy.editor as mpy

#下载心形脉络图和文字
filename = ("https://live.staticflickr.com/65535/51375413098_6835046704_o.png")
urllib.request.urlretrieve(filename, "fullheart.png")
filename = ("https://live.staticflickr.com/65535/51376189625_5ce9caa671_o.png")
urllib.request.urlretrieve(filename, "fullwords.png")

#### 参数和约束条件
infection_rate = 0.4
incubation_rate = 0.1

dispersion_rates  = [0, 0.07, 0.03] # for S, I, R

# 该内核会模拟病毒如何用一个位置扩散至邻近位置
dispersion_kernel = np.array([[0.5, 1 , 0.5],
                                [1  , -6, 1],
                                [0.5, 1, 0.5]]) 

heart = mpy.ImageClip("fullheart.png").resize(width=400)
words = mpy.ImageClip("fullwords.png").resize(width=400) #后面在渲染的时候直接把文字矩阵与心形图矩阵相加
SIR = np.zeros( (3,heart.h, heart.w),  dtype=float)
SIR[0] = heart.get_frame(0).mean(axis=2)/255
WORDS=words.get_frame(0)

start = int(0.4*heart.h), int(0.611*heart.w) #在这里修改最开始感染的位置
SIR[1,start[0], start[1]] = 0.8 # infection in Grenoble at t=0

dt = 1.0 # 一次更新=实时1个小时
hours_per_second= 7*24 # one second in the video = one week in the model
world = {'SIR':SIR, 't':0}


##### 建模

def infection(SIR, infection_rate, incubation_rate):
    """ Computes the evolution of #Sane, #Infected, #Rampaging"""
    S,I,R = SIR
    newly_infected = infection_rate*R*S
    newly_rampaging = incubation_rate*I
    dS = - newly_infected
    dI = newly_infected - newly_rampaging
    dR = newly_rampaging
    return np.array([dS, dI, dR])

def dispersion(SIR, dispersion_kernel, dispersion_rates):
    """ Computes the dispersion (spread) of people """
    return np.array( [convolve(e, dispersion_kernel, cval=0)*r
                       for (e,r) in zip(SIR, dispersion_rates)])

def update(world):
    """ spread the epidemic for one time step """
    infect = infection(world['SIR'], infection_rate, incubation_rate)
    disperse = dispersion(world['SIR'], dispersion_kernel, dispersion_rates)
    world['SIR'] += dt*( infect + disperse)
    world['t'] += dt

 
# 用MoviePy制作动画

def world_to_npimage(world):
    """ Converts the world's map into a RGB image for the final video."""
    coefs = np.array([2,25,25]).reshape((3,1,1))
    accentuated_world = 255*coefs*world['SIR']
    image = accentuated_world[::-1].swapaxes(0,2).swapaxes(0,1)
    return np.minimum(255, image)+WORDS #加上文字

def make_frame(t):
    """ Return the frame for time t """
    while world['t'] < hours_per_second*t:
        update(world)
    return world_to_npimage(world)


animation = mpy.VideoClip(make_frame, duration=16)
# 可以将结果写为视频或GIF(速度较慢),每次选择一个格式渲染
# animation.write_gif('fullheart.gif', fps=30)
animation.write_videofile('fullheart.mp4', fps=30)

昨天发了以后,有大佬用了Docker来牵线配对,感谢Pzxc呀:在2021年为七夕Python程序与Docker牵线配对

另外DataWhale这里新出了几种python花式表白的方法,有兴趣的朋友可以看看:浪漫的形式有100种,单身的就1种!

最后参考DataWhale的带啊吗,我又画了朵红玫瑰:用python画一朵鲜艳欲滴的红玫瑰

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值