我们的每N周一坑栏目又来了。
之前我们有过和图像处理相关的题目:
今天再来一个和图片有关的:图片切割。
非常简单的功能,但在开发中很常见,很多网页/应用里缩略图都是对图片进行缩放+切割得到的。
增加一点点趣味性,我们的要求是:
把一张图片切成 3 x 3 九张小图
这样就可以把它们发在朋友圈重新组成一张大图了。
示例:原图
效果
当然,原图是正方形效果最好。
附加题:
- 对于不是正方形的原图,截取中间尽可能大的正方形区域,再分割成九张小图(需考虑长>宽和长<宽两种情况)
- 切图时将朋友圈小图之间的间隔考虑进去,使拼接出的大图看起来更连续
提示:仍然用之前提到过的 PIL 库,里面的 crop 方法即可实现(py3 安装包名为 pillow)。
参考代码将在下周给出,或看看其他同学在留言中提交的代码。
期待各位同学提交解答。
提交代码可以使用 paste.ubuntu.com 或
codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。
往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。
【解答】蜥蜴流感与贝叶斯定理
案例本身是一个典型的条件概率,用贝叶斯定理即可算出概率,概率统计的书籍和网上都可以搜到详细解释。
P = (0.01 * 0.9) / (0.01 * 0.9 + (1 - 0.01) * 0.09)
= 0.0917
而我们的问题是要模拟这个场景。所以我们可以循环10万次,用 random 模块根据已知的概率来“产生”病例和阳性结果,并统计最终实际的阳性患病率。
给出一份参考代码:
import random # 定义个体 class Man: flu = False #是否患病 test = False #是否阳性 # 产生10万个体,随机患病和检测状况 all_people = [] for i in range(100000): m = Man() # 患病概率 if random.random() < 0.01: m.flu = True # 真阳性概率 if m.flu and random.random() < 0.9: m.test = True # 假阳性概率 if not m.flu and random.random() < 0.09: m.test = True all_people.append(m) # 统计个数 positive_people = [m for m in all_people if m.test] print(len(positive_people)) positive_flu = [m for m in positive_people if m.flu] print(len(positive_flu)) # 实际患病者在阳性者中的比例 print(len(positive_flu)/len(positive_people))
这里先模拟生成了10万份数据,然后统计结果。当然也可以边生成边统计,@Mr. wang、@铭记、@L、@杀哥 就是用的类似方法,有的写得比我还更简洁。
同时提交解答的还有 @Jzy、@灿夜、@冬日炎炎。感谢各位同学的参与,希望下次继续。
期待在下一期中看到你的代码!
- 如需了解视频课程及答疑群等更多服务,请号内回复 码上行动
- 代码相关问题可以在论坛上发帖提问 bbs.crossincode.com
推荐阅读:
朋友圈 |电影票 | 百万关注 | 技术宅 | 火车票 | 单词表 | 押韵工具 | 新手建议 | 就业 | 知乎 | 排序