用Numpy/Python快速提取矩阵

2024-10-02 10:20:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要(迅速)提取矩阵。在

稀疏-将丰度矩阵转换为均匀采样深度。在

在本例中,每一行都是一个样本,采样深度是该行的总和。我想用min(rowsums(matrix))个样本随机抽样(替换)矩阵。在

假设我有一个矩阵:

>>> m = [ [0, 9, 0],
...       [0, 3, 3],
...       [0, 4, 4] ]

稀疏函数逐行随机抽样,替换次数为min(rowsums(matrix))次(在本例中为6次)。在

^{pr2}$

结果是随机的,但行和总是相同的。在

>>> rf = rarefaction(m)
>>> rf
    [ [0, 6, 0],   # sum = 6
      [0, 2, 4],   # sum = 6
      [0, 4, 2], ] # sum = 6

PyCogent有一个逐行执行此操作的函数,但在大型矩阵上运行速度非常慢。在

我有一种感觉,在Numpy中有一个函数可以做到这一点,但我不确定它会被称为什么。在


Tags: 函数矩阵min次数matrix速度样本sum
2条回答

我认为这个问题并不完全清楚。我想稀疏矩阵给出了从原始矩阵的每个系数中提取的样本数?在

查看链接中的代码,可能会加快速度。对转置矩阵进行操作,并重写链接的代码以对列而不是行进行操作。因为这样可以让处理器更好地缓存它采样的值,也就是说,内存中的跳转次数更少。在

剩下的我也会这么做,使用numpy(不一定意味着这是最有效的方法)。在

如果你需要它更快,你可以尝试在C++中对函数进行编码,并将其包含到Python中。细纹织物. 在C++中,我会对每一行进行查询,并构建一个查找表,这些表的位置为Gt;0,在查找表中的项目数量等于范围内生成^ {CD1}}整数。我将累积查找表中每个位置的绘制频率,然后将这些数字放回数组中的正确位置。从文字上讲,代码应该只有几行。在

import numpy as np
from numpy.random import RandomState

def rarefaction(M, seed=0):
    prng = RandomState(seed) # reproducible results
    noccur = np.sum(M, axis=1) # number of occurrences for each sample
    nvar = M.shape[1] # number of variables
    depth = np.min(noccur) # sampling depth

    Mrarefied = np.empty_like(M)
    for i in range(M.shape[0]): # for each sample
        p = M[i] / float(noccur[i]) # relative frequency / probability
        choice = prng.choice(nvar, depth, p=p)
        Mrarefied[i] = np.bincount(choice, minlength=nvar)

    return Mrarefied

示例:

^{pr2}$

干杯, 戴维德

相关问题 更多 >

    热门问题