gpt4 book ai didi

python - 在 python 的元组列表中查找连续系列

转载 作者:行者123 更新时间:2023-12-05 09:00:56 25 4
gpt4 key购买 nike

我正在努力解决以下问题:我想编写一些小代码来去除质谱数据的同位素。

为此,我比较了两个信号之间的差异是否等于质子质量除以电荷状态。到目前为止,非常简单。

我现在正在努力寻找超过两个峰的系列。

我将问题分解为有一个元组列表,一个系列是 n 个元组,其中前一个元组的最后一个数字等于当前元组的第一个元组。

来自这里:

[(1,2), (2,3), (4,5), (7,9), (8,10), (9,11)]

对此:

[(1,2,3), (4,5), (7,9,11), (8,10)]

简单的订单将失败,因为可能有跳跃 (7-->9) 和中间信号 (8,10)

这里是一些测试数据:

import numpy as np

proton = 1.0078250319

data = [
(632.3197631835938, 2244.3374), #0
(632.830322265625, 2938.797), #1
(634.3308715820312, 1567.1385), #2
(639.3309326171875, 80601.41), #3
(640.3339233398438, 23759.367), #4
(641.3328247070312, 4771.9946), #5
(641.8309326171875, 2735.902), #6
(642.3365478515625, 4600.567), #7
(642.84033203125, 1311.657), #8
(650.34521484375, 11952.237), #9
(650.5, 1), #10
(650.84228515625, 10757.939), #11
(651.350341796875, 6324.9023), #12
(651.8455200195312, 1398.8452), #13
(654.296875, 1695.3457)] #14

mz, i = zip(*data)

mz = np.array(mz)
i = np.array(i)

arr = np.triu(mz - mz[:, np.newaxis])

charge = 2

所以实际上,在第一步中,我只对 mz 值感兴趣。我从所有值中减去所有值并隔离上三角。

为了计算,如果两个信号实际上在正确的质量范围内,我会使用以下代码:

>>> pairs = tuple(zip(*np.where(abs(arr - (proton / charge)) < 0.01)))
((0, 1), (5, 6), (6, 7), (7, 8), (9, 11), (11, 12), (12, 13))

现在,相应的信号是肉眼清楚的:

峰 1:0 到 1

峰 2:5 到 8

峰 3:9 到 13,没有 10。

所以原则上,我想将每个元组的第二个值与任何其他元组的第一个值进行比较,以确定相应的序列。

我尝试的是展平列表,删除重复项并在此一维列表中找到相应的计数。但这失败了,因为发现了 5-9 的峰值。

我想要一个矢量化解决方案,因为此计算是针对 30000 多个光谱中多个电荷状态的 100-500 个信号完成的。

我很确定,之前有人问过这个问题,但找不到合适的解决方案。

最终,这些系列用于检查相应峰的强度,将它们相加并使用最大的初始值分配此处的去同位素峰。

谢谢基督徒

附言。另外,如果对现有代码有一些建议,我很乐意学习。我是矢量化计算的新手,通常会编写大量的 for 循环,这需要很长时间才能完成。

最佳答案

在图论中,您的问题将是“如何在图中找到所有断开连接的子图?”。

那么为什么不使用网络分析库,例如 networkx:

import networkx as nx
# Your tuples become the edges of the graph.
edge = [(1,2), (2,3), (4,5), (7,9), (8,10), (9,11)]

# We create the graph
G = nx.Graph()
G.add_edges_from(edge)

# Use connected_components to detect the subgraphs.
d = list(nx.connected_components(G))

我们得到了预期的结果:

[{1, 2, 3}, {4, 5}, {7, 9, 11}, {8, 10}]

有 4 个子图:

enter image description here

关于python - 在 python 的元组列表中查找连续系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74534622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com