我正在处理尺寸NxN ~(100k x 100k)
太大而无法放入内存的大型密集方形矩阵。
在做了一些研究之后,我发现大多数人使用 numpy 的memap或pytables包来处理大型矩阵。但是,我发现这些软件包似乎有很大的局限性。它们似乎都不提供支持 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.
我只是想知道是否有更好的解决方案来为任意二维大矩阵切片赋值?