我有一个列表中的范围,如:
ranges = [(1, 50), (49, 70), (75, 85), (84, 88), (87, 92)]
Run Code Online (Sandbox Code Playgroud)
我想找到可以从这些构建的最长范围(当它们相互重叠时)。
预期输出:
[(1, 70), (75, 92)]
Run Code Online (Sandbox Code Playgroud)
我有一个解决方案,但是它太复杂了,我相信一定有一个更简单的解决方案来解决这个问题
我的解决方案:
def overlap(x, y):
return range(max(x[0], y[0]), min(x[-1], y[-1]) + 1)
ranges = [(1, 50), (49, 70), (75, 85), (84, 88), (87, 92)]
beg, end = min([x[0] for x in ranges]), 0
for i in ranges:
if i[0] == beg:
end = i[1]
while beg:
for _ in ranges:
for i in ranges:
if i[1] > end and …Run Code Online (Sandbox Code Playgroud) 我用Python numpy.
我有一个numpy索引数组a:
>>> a
array([[5, 7],
[12, 18],
[20, 29]])
>>> type(a)
<type 'numpy.ndarray'>
Run Code Online (Sandbox Code Playgroud)
我有一个numpy索引数组b:
>>> b
array([[2, 4],
[8, 11],
[33, 35]])
>>> type(b)
<type 'numpy.ndarray'>
Run Code Online (Sandbox Code Playgroud)
我需要加入一个数组a的数组b:
a+ b=>[2, 4] [5, 7] [8, 11] [12, 18] [20, 29] [33, 35]
=> a并且b有索引数组=> [2, 18] [20, 29] [33, 35]
(索引([2, 4][5, 7][8, 11][12, 18])按顺序进行
=> 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18=> [2, 18])
对于这个例子:
>>> …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,其中left列是对象最左侧的位置,而right列是最右侧的位置。如果对象重叠,或者它们重叠(递归地)重叠的对象,我需要对它们进行分组。因此,例如,如果这是我的数据框:
left right
0 0 4
1 5 8
2 10 13
3 3 7
4 12 19
5 18 23
6 31 35
Run Code Online (Sandbox Code Playgroud)
所以线0和3重叠 - 因此它们应该在同一组中,并且线1也是重叠线3 - 因此它加入了该组。
所以,对于这个例子,输出应该是这样的:
left right group
0 0 4 0
1 5 8 0
2 10 13 1
3 3 7 0
4 12 19 1
5 18 23 1
6 31 35 2
Run Code Online (Sandbox Code Playgroud)
我想到了各种方向,但没有弄清楚(没有丑陋的for)。任何帮助将不胜感激!
我有一个 pandas 数据框,如下所示:
chrom start end probability read
0 chr1 1 10 0.99 read1
1 chr1 5 25 0.99 read2
2 chr1 15 25 0.99 read2
3 chr1 30 40 0.75 read4
Run Code Online (Sandbox Code Playgroud)
我想要做的是合并具有相同染色体(chrom 列)且坐标(开始,结束)重叠的间隔。在某些情况下,如果多个间隔彼此重叠,则即使它们不重叠,也会存在应该合并的间隔。请参阅上述示例中的第 0 行和第 2 行以及下面的合并输出
对于那些合并的元素,我想对它们的概率(概率列)进行求和,并计算“读取”列中的唯一元素。
使用上面的示例将导致以下输出,请注意行 0,1 和 2 已合并:
chrom start end probability read
0 chr1 1 20 2.97 2
1 chr1 30 40 0.75 1
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直在使用 pybedtools merge 来执行此操作,但事实证明,执行数百万次(我的情况)时速度很慢。因此,我正在寻找其他选择,而 pandas 是显而易见的选择。我知道使用 pandas groupby可以对要合并的列应用不同的操作,例如nunique和sum,这是我需要应用的操作。尽管如此,pandas groupby 仅合并具有精确“chrom”、“start”和“end”坐标的数据。
我的问题是我不知道如何使用 pandas 根据坐标(chrom、start、end)合并行,然后应用求和和 …
我正在尝试从范围集合中删除重叠值.
范围由如下字符串表示:
499-505 100-115 80-119 113-140 500-550
我希望将上述内容减少到两个范围:80-140 499-550.这涵盖了所有值,没有重叠.
目前我有以下代码.
cr = "100-115 115-119 113-125 80-114 180-185 500-550 109-120 95-114 200-250".split(" ")
ar = []
br = []
for i in cr:
(left,right) = i.split("-")
ar.append(left);
br.append(right);
inc = 0
for f in br:
i = int(f)
vac = []
jnc = 0
for g in ar:
j = int(g)
if(i >= j):
vac.append(j)
del br[jnc]
jnc += jnc
print vac
inc += inc
Run Code Online (Sandbox Code Playgroud)
我将数组拆分-并将范围限制存储在ar …
背景
我有一个用零初始化的1D NumPy数组.
import numpy as np
section = np.zeros(1000)
Run Code Online (Sandbox Code Playgroud)
然后我有一个Pandas DataFrame,其中我有两列索引:
d= {'start': {0: 7200, 1: 7500, 2: 7560, 3: 8100, 4: 11400},
'end': {0: 10800, 1: 8100, 2: 8100, 3: 8150, 4: 12000}}
df = pd.DataFrame(data=d, columns=['start', 'end'])
Run Code Online (Sandbox Code Playgroud)
对于每对索引,我想将numpy数组中相应索引的值设置为True.
我目前的解决方案
我可以通过将函数应用于DataFrame来实现:
def fill_array(row):
section[row.start:row.end] = True
df.apply(fill_array, axis=1)
Run Code Online (Sandbox Code Playgroud)
我想矢量化这个操作
这正如我所料,但为了它的乐趣,我想矢量化操作.我对此并不十分熟悉,而且我在线搜索并没有让我走上正轨.
如果可能的话,我真的很感激有关如何将其转换为矢量操作的任何建议.
我在其他编程语言(ruby、C++、JS 等)中发现了许多类似的问题,但在 Python 中却没有。因为Python有例如itertools我想知道我们是否可以在Python中更优雅地做同样的事情。
假设我们有一个“完整范围”,[1,100]然后是“完整范围”内/匹配“完整范围”的范围子集:
[10,50][90,100][1,9]在本例中,我们如何提取未覆盖的位置[51,89]?
这是一个玩具示例,在我的真实数据集中,范围高达数千。