200. 岛屿数量(Python)

Python028

200. 岛屿数量(Python),第1张

难度:★★★☆☆

类型:数组

方法:深度优先搜索

传送门

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

输入:

[

['1','1','1','1','0'],

['1','1','0','1','0'],

['1','1','0','0','0'],

['0','0','0','0','0']

]

输出: 1

输入:

[

['1','1','0','0','0'],

['1','1','0','0','0'],

['0','0','1','0','0'],

['0','0','0','1','1']

]

输出: 3

解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

可以使用深度优先搜索方法,逐个点遍历,每次遇到一个岛屿,就将这个岛屿淹没,统计被淹没的岛屿的数目就好。这里为了便于理解,采用了实例化岛屿和探测点。

如有疑问或建议,欢迎评论区留言~

待更新  2020.5.10

-1.把Fst值较高的区域(比如前百分之1)当成岛屿(或者Dxy值,这里以Fst为例)   (但为什么要这样做我并不明白)。

0. Fst/Pi/Dxy是什么

1.Fst值(还有Dxy,Pi)的计算

1.1 工具

https://github.com/simonhmartin/genomics_general  使用的是这里的脚本(也可以用vcftools)

wget https://github.com/simonhmartin/genomics_general/archive/refs/heads/master.zip解压即可

1.2 转换格式

./VCF_processing/parseVCF.py -i try.vcf -o try.geno    得到try.geno文件

.geno文件有这几种格式,对应的,更改下一步的 -f 参数  我这里是-f phased

1.3 计算

python popgenWindows.py -w 20000 -m 200 --windType coordinate -g try.geno -o try.csv -f phased -T 5 -p A A1,A2,A3,A4,A5,A6 -p B B1,B2,B3,B4,B5,B6,B7,B8,B9 --popsFile pop.file

-w是窗口值大小;-g是输入文件即1.2的输出文件;-o即输出文件;-m即使MinSites,这里-m 200的意思是:如果这个窗口里面的sites(SNP)低于200,就把这个窗口扔掉;--windType即窗口类型,coordinate 这个类型是指窗口的坐标恒定,但是里面的sites数量可能不同;;另一种窗口类型是 sites ,即每个窗口里面的sites数量相同,但是坐标不同;-T是线程数;-p则指定群体以及群体包含了哪些个体。 --popsFile这个文件的内容是两列,一列是个体名,一列是群体名。

得到try.csv

1.4 结果如下

1.5 画图(R)

对于Pi  

待补充,正在学习

对于Fst和Dxy可以简单粗暴的把一个窗口当成一个SNP,手动加一列就行,然后拿去画图。

qqman、CMplot这两个包均可实现

https://www.jianshu.com/p/1edc44fe922f      qqman

https://www.burning.net.cn/article/article-29     CMplot

但是我的疑问是在于一个窗口中有很多个Sites,如果Sites = SNP,那这样的画法明显不合适