gpt4 book ai didi

python - 为什么从一个 ndarray 复制到另一个 ndarray 内存消耗?

转载 作者:太空宇宙 更新时间:2023-11-03 14:03:39 27 4
gpt4 key购买 nike

我在尝试使用 numpy 打乱多维数组时遇到问题。可以使用以下代码重现该问题:

import numpy as np
s=(300000, 3000)
n=s[0]
print ("Allocate")
A=np.zeros(s)
B=np.zeros(s)
print ("Index")
idx = np.arange(n)
print ("Shuffle")
idx = np.random.shuffle(idx)
print ("Arrange")
B[:,:] = A[idx,:] # THIS REQUIRES A LARGE AMOUNT OF MEMORY

当运行此代码时(python 2.7 以及 python 3.6 with numpy 1.13.1 on win7 64bit),最后一行代码的执行需要大量内存(~ 10 Gb),这听起来很奇怪我。

实际上,我希望将数据从一个数组复制到另一个数组,两者都是预先分配的,所以我可以理解复制会消耗时间,但不明白为什么它需要内存。

我想我做错了什么,但找不到什么...也许有人可以帮助我?

最佳答案

问题不在于复制,问题在于你的数组很大:

>>> 300000 * 3000 * 8 / 1024 / 1024 / 1024  # 8 byte floats, 300000 * 3000 elements converted to GB
6.705522537231445

所以数组几乎有 7GB 的大小。那么它为什么只在赋值行 B[:,:] = A[idx,:] 触发?

那是因为 zeros 在您想要使用它之前实际上并不分配数组。在为它编制索引(在 A 的情况下:A[idx, :])或分配给它(在 B 的情况下)之前,您不会使用它: B[:,:] =).

所以没有什么奇怪的事情发生,这只是 AB 实际需要的内存量。

关于python - 为什么从一个 ndarray 复制到另一个 ndarray 内存消耗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46074422/

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