如果切片无法解决内存错误,如何合并两个大型numpy数组?

如果切片无法解决内存错误,如何合并两个大型numpy数组?,第1张

如果切片无法解决内存错误,如何合并两个大型numpy数组?

每次调用

np.vstack
NumPy时,都必须为一个全新的数组分配空间。因此,如果说1行需要1单位内存

np.vstack([container, container2])

需要 额外

900+5000
的存储单元。此外,在分配发生之前,Python需要保留旧空间
mergedContainer
(如果存在)以及新空间
mergedContainer
。因此,
mergedContainer

使用分片进行迭代构建实际上比尝试通过单个调用进行构建需要更多的内存
np.vstack


迭代构建:

| total | mergedContainer | container1 | container2 | temp |    ||-------+-----------------+------------+------------+------+----------------------------------------------------------------------||  7800 | 1900 |        900 |       5000 |    0 | mergedContainer = np.vstack((container1, container2[:1000]))         || 11200 | 3400 |        900 |       5000 | 1900 | mergedContainer = np.vstack((mergedContainer, container[1000:2500])) || 13200 | 3900 |        900 |       5000 | 3400 | mergedContainer = np.vstack((mergedContainer, container[2500:3000])) |

通过一次调用np.vstack来构建它:

| total | mergedContainer | container1 | container2 | temp |||-------+-----------------+------------+------------+------+-------------------------------------------------------|| 11800 | 5900 |        900 |       5000 |    0 | mergedContainer = np.vstack((container1, container2)) |

但是,我们可以做得更好。而不是调用的

np.vstack
重复, 分配所有需要的空间 ,一旦
从一开始
双方的,写的内容
container1
container2
把它。换句话说,避免分配两个不同的数组
container1
container2
如果您最终知道要合并它们。

container = np.empty((5900, 4000))

请注意,基本切片(例如

container[:900]
始终返回view)和view基本上不需要额外的内存。因此,您可以这样定义
container1
container2

container1 = container[:900]   container2 = container[900:]

然后 在适当的位置 分配值。这将修改

container

container1[:] = ...   container2[:] = ...

因此,您的内存需求将保持在5900单位左右。


例如,

import numpy as npnp.random.seed(2015)container = np.empty((5, 4), dtype='int')container1 = container[:2]   container2 = container[2:]   container1[:] = np.random.randint(10, size=(2,4))container2[:] = np.random.randint(1000, size=(3,4))print(container)

产量

[[  2   2   9   6] [  8   5   7   8] [112  70 487 124] [859   8 275 936] [317 134 393 909]]

而只需要一个形状(5,4)阵列的空间,以及临时阵列的临时使用空间。

因此,您无需在代码中进行太多更改即可节省内存。只需设置

container = np.empty((5900, 4000))container1 = container[:900]   container2 = container[900:]

然后使用

container1[:] = ...

代替

container1 = ...

就地 分配值。(或者,当然,您可以直接写入

container
。)



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5661730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存