gpt4 book ai didi

python - 为大型密集方阵的列表切片赋值 (Python)

转载 作者:行者123 更新时间:2023-12-01 06:45:03 26 4
gpt4 key购买 nike

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

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

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

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

M[0, [1,2,3,1,2,3,1,2,3], [8,8,8,15,15,15,30,30,30]] = 0 # 用于内存映射

  • 使用 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 似乎并不是处理具有大量行的矩阵的最有效方法。 (或者是否可以通过指定 block 大小来消除此消息?)我收到以下警告消息:

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.

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

最佳答案

首先,请注意,在 numpy 中(不确定 pytables)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.])

关于python - 为大型密集方阵的列表切片赋值 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59268049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com