首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中有效地获取稀疏数据的移动平均值并过滤阈值以上的数据

在python中有效地获取稀疏数据的移动平均值并过滤阈值以上的数据
EN

Stack Overflow用户
提问于 2013-05-02 13:07:02
回答 1查看 1.3K关注 0票数 5

我正在接触一些基因组分析,有点卡住了。我有一些非常稀疏的数据,需要找到移动平均值超过某个阈值的地方,将每个点标记为1或0。数据的类型是唯一的,所以我不能使用可用的程序进行分析。

每个点代表人类基因组上的一个点(basepair)。对于每个数据集,都有200,000,000个潜在的点。数据本质上是一个大约12000个索引/值对的列表,其中所有其他点都被假定为零。我需要做的是对整个数据集进行移动平均值,并返回平均值高于阈值的区域。

我目前正在从数据集中顺序读取每个点,并围绕我找到的每个点构建一个数组,但对于大窗口来说,这是非常慢的。有没有更有效的方法来做到这一点,也许是使用scipy或熊猫?

编辑:Jamie下面的魔术代码工作得很好(但我还不能支持)!我非常感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-02 14:35:37

你可以用numpy把整个东西矢量化。我已经构建了这个随机数据集,其中包含12,000个索引,介于0和199,999,999之间,以及一个同样长的介于0和1之间的随机浮点数列表:

代码语言:javascript
运行
复制
indices = np.unique(np.random.randint(2e8,size=(12000,)))
values = np.random.rand(len(indices))

然后,我在每个indices周围构造了一个总窗口大小为2*win+1的索引数组,以及该点对移动平均贡献了多少的相应数组:

代码语言:javascript
运行
复制
win = 10

avg_idx = np.arange(-win, win+1) + indices[:, None]
avg_val = np.tile(values[:, None]/(2*win+1), (1, 2*win+1))

剩下的就是找出重复的指数,并将贡献加到移动平均线上:

代码语言:javascript
运行
复制
unique_idx, _ = np.unique(avg_idx, return_inverse=True)
mov_avg = np.bincount(_, weights=avg_val.ravel())

您现在可以获得移动平均值超过0.5的指数列表,如下所示:

代码语言:javascript
运行
复制
unique_idx[mov_avg > 0.5]

至于性能,首先把上面的代码变成一个函数:

代码语言:javascript
运行
复制
def sparse_mov_avg(idx, val, win):
    avg_idx = np.arange(-win, win+1) + idx[:, None]
    avg_val = np.tile(val[:, None]/(2*win+1), (1, 2*win+1))
    unique_idx, _ = np.unique(avg_idx, return_inverse=True)
    mov_avg = np.bincount(_, weights=avg_val.ravel())
    return unique_idx, mov_avg

对于开头描述的测试数据,以下是几种窗口大小的一些计时:

代码语言:javascript
运行
复制
In [2]: %timeit sparse_mov_avg(indices, values, 10)
10 loops, best of 3: 33.7 ms per loop

In [3]: %timeit sparse_mov_avg(indices, values, 100)
1 loops, best of 3: 378 ms per loop

In [4]: %timeit sparse_mov_avg(indices, values, 1000)
1 loops, best of 3: 4.33 s per loop
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16330689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档