1

我正在处理尺寸NxN ~(100k x 100k)太大而无法放入内存的大型密集方形矩阵。

在做了一些研究之后,我发现大多数人使用 numpy 的memappytables包来处理大型矩阵。但是,我发现这些软件包似乎有很大的局限性。它们似乎都不提供支持 ASSIGN 值来沿多个维度列出磁盘上矩阵的切片。

我想寻找一种有效的方法来将值分配给一个大的密集方阵M,例如:

M[0, [1,2,3], [8,15,30]] = np.zeros((3, 3)) # or

M[0, [1,2,3,1,2,3,1,2,3], [8,8,8,15,15,15,30,30,30]] = 0 # for memmap

  • 使用memmap,表达式M[0, [1,2,3], [8,15,30]]将始终将切片复制到 RAM 中,因此分配似乎不起作用。
  • 使用pytables,不支持沿超过 1 个维度的列表切片。目前我只是沿着一个维度切片,然后是另一个维度(即M[0, [1,2,3]][:, [8,15,30]])。此解决方案的 RAM 使用量将随 N 扩展,这比处理整个数组 (N^2) 更好,但仍然不理想。

  • 此外,pytables似乎不是处理具有大量行的矩阵的最有效方法。(或者是否有一种方法可以指定块大小以消除此消息?)我收到以下警告消息:

The Leaf ``/M`` is exceeding the maximum recommended rowsize (104857600 bytes);
be ready to see PyTables asking for *lots* of memory and possibly slow
I/O.  You may want to reduce the rowsize by trimming the value of
dimensions that are orthogonal (and preferably close) to the *main*
dimension of this leave.  Alternatively, in case you have specified a
very small/large chunksize, you may want to increase/decrease it.

我只是想知道是否有更好的解决方案来为任意二维大矩阵切片赋值?

4

1 回答 1

0

首先,请注意,在 numpy 中(不确定 pytables)将返回一个与 elements和相对应M[0, [1,2,3], [8,15,30]]的形状数组,因此分配给它会引发错误。(3,)M[0,1,8]M[0,2,15]M[0,3,30]np.zeros((3,3))

现在,以下内容适用于我:

np.save('M.npy', np.random.randn(5,5,5))  # create some dummy matrix
M = np.load('M.npy', mmap_mode='r+')  # load such matrix as a memmap
M[[0,1,2],[1,2,3],[2,3,4]] = 0
M.flush()  # make sure thing is updated on disk
del M
M = np.load('M.npy', mmap_mode='r+')  # re-load matrix
print(M[[0,1,2],[1,2,3],[2,3,4]])  # should show array([0., 0., 0.])
于 2019-12-10T21:02:30.913 回答