基于Numpy的大规模矩阵乘法

2024-06-05 23:56:08 发布

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

我面临一个问题,我需要在两个大矩阵A [400000 x 70000]B [70000 x 1000]之间执行矩阵乘法。这两个矩阵是稠密的,没有我可以利用的特殊结构。在

目前我的实现是将A分成多个行块,比如,sub_A [2000 x 70000]和perfrom{}。我注意到在I/O上花费了很多时间,即在sub_A中读取。读入矩阵大约需要500秒,计算大约需要300秒。在

在这里使用PyTables有助于提高I/O效率吗?有没有图书馆可以帮助提高时间效率?在

代码如下:

def sim_phe_g(geno, betas, chunk_size):
    num_indv = geno.row_count
    num_snps = geno.col_count
    num_settings = betas.shape[1]

    phe_g = np.zeros([num_indv, num_settings])
    # divide individuals into chunks
    for i in range(0, num_indv, chunk_size):
        sub_geno = geno[i : i + chunk_size, :]
        sub_geno = sub_geno.read().val
        phe_g[i : i + chunk_size, :] = np.dot(sub_geno, betas)
    return phe_g

geno大小为[400000 x 70000],而{}大小为[70000 x 1000]geno这是一个存储在磁盘中的大矩阵。语句sub_geno = sub_geno.read().val将把基因型的一大块加载到内存中。而且这个声明花费了很多时间。在

另外,由于32GB内存大小的限制,我将大矩阵分成块。在


Tags: readsizesettingscountnp时间矩阵num
2条回答

如果适用,尝试使用tensorflow进行大矩阵乘法,正如您从这个article中看到的,在许多情况下,tensorflow在大矩阵的情况下表现得更好。同样的原因很可能是它主要是为了高效地处理大型矩阵而构建的。在

有关矩阵乘法具体用法的详细信息,请参阅documentation。在

我在(10001000)矩阵上测试了它的乘法运算:

对于numpy.matmul=60ms±5.35

对于tensorflow.matmul=42.5 ms±2.47 m

平均每人进行100次共享和stdev测试

p.S.Tensorflow的cpu版本仅使用

尝试使用TensowFlow进行GPU优化,这对矩阵乘法非常好,因为它允许您并行化每个操作。在

相关问题 更多 >