0

我最近开始使用 numpy memmap 在我的项目中链接一个数组,因为我有一个 3 维张量,用于作为示例的数据集图的总共 1330 亿个值。

我正在尝试计算 5748 个节点图(DD 数据集的第 21 个)的热核签名。我计算投影仪的代码(我使用 memmap 的地方)是:

Path('D:/hks_temp').mkdir(parents=True, exist_ok=True)
for l, ll in enumerate(L):
    pl = np.zeros((n, n))
    for k in ll:
        pl += np.outer(evecs[:, k], evecs[:, k])
    fp = np.memmap('D:/hks_temp/{}_hks.npy'.format(l), dtype='float32', mode='w+', shape=(n, n))
    fp[:] = pl[:]
    fp.flush()

在所有的X_hks.npy里面都有一个 n ndarray(来自示例 5748 * 5748)。

然后我希望所有这些计算数组形成 3 维张量,所以我以这种方式“链接”(我不知道这是否是正确的术语)它们:

P = np.array([None] * len(L))    # len(L) = 4043
for l in range(len(L)):
    P[l] = np.memmap('D:/hks_temp/{}_hks.npy'.format(l), dtype='float32', mode='r', shape=(n, n))

P稍后仅用于循环内部H = np.einsum('ijk,i->jk', P, np.exp(-unique_eval * t))

但是,这会引发错误:ValueError: einstein sum subscripts string contains too many subscripts for operand 0. 由于该方法对于不需要 memmap 的较小图形是正确的,所以我的想法是 P 对于 numpy 的结构不好,我必须安排数据,也许要进行整形。所以我试着做 aP.reshape(len(L), n, n)但它不起作用 give ValueError: cannot reshape array of size 4043 into shape (4043,5748,5748)。我怎样才能让它工作?

我已经找到了这个问题,但它不适合这种情况。我认为我不能将所有内容存储在一个大对象中,因为它包含 497GB 的 memmap 文件(每个 126MB)。如果我能做到,请告诉我。

如果不可能做到这一点,我会减少用例,但是我很感兴趣让它适用于所有可能性。

4

0 回答 0