【每周一坑】生成九宫格图片
我们的每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、@灿夜、@冬日炎炎。感谢各位同学的参与,希望下次继续。
期待在下一期中看到你的代码!