将2D numpy数组列表转换为3D数组时的内存复制

2024-04-18 21:43:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将2D numpy数组的列表转换为3D数组,我想知道是否复制了数据。你知道吗

例如,使用此程序:

images = []
for i in range(10):
    images.append(numpy.random.rand(100, 100))
volume = numpy.array(images)

有没有办法检查volume[n]是否引用与images[n]相同的内存块?你知道吗

我需要我的数据是一个三维数组,我正在尝试评估是否应该接受图像列表作为输入,或者这是否会导致数据被复制。数据拷贝是不可接受的,因为我正在处理非常大的数据集。你知道吗


Tags: 数据in程序numpy列表forrangerandom
3条回答

导入numpy之后,Windows任务管理器说我的Python进程使用了14mb。在构建images(尽管使用了range(5000))之后,它达到了396MB(多382MB)。在构建volume之后,它达到了778MB(又多了382MB)。看起来像是复制品。在windows10上使用python3.5.2中的numpy1.11.1。你知道吗

我可以引用一个关于列表和数组之间的存储差异的问题,但要根据您的情况进行调整:

您的列表有一个数据缓冲区,其中包含指向存储在内存中其他位置的数组对象的指针。images.append只是更新指针列表。列表副本只会复制指针。你知道吗

数组将其所有数据存储在一个连续的内存缓冲区中。因此,要创建volumenp.array(),必须将每个组件数组的值复制到它自己的缓冲区。如果使用np.concatenate的某个版本来编译3d数组,则同样适用。你知道吗

numpy函数通常在开头有一个x=np.asarray(x)语句。实际上它是在说,“我正在处理一个数组,但我会让你给我一个列表”。你知道吗

你可以跳过它,只接受一个3d数组。但是这个3d阵列是如何构建的呢?对于一个随机的3d数组,您只需一句话:

arr = numpy.random.rand(10, 100, 100)

但是,如果图像是从文件中单独加载的,则某些人或某些人将不得不执行一个或多个副本来创建三维图像阵列。是你,还是你的用户?你知道吗

我的一般建议是,在代码运行之前,不要过于偏执地制作副本,除非通过分析发现副本很昂贵,否则就会出现内存错误问题。你知道吗

numpy允许您测试两个数组是否共享内存(在本例中,这是一个很好的代理,用于测试没有复制的数组)

for i, img in enumerate(images):
    print(i, numpy.may_share_memory(img, volume))
# all False

看来这次是复制的。你知道吗

相关问题 更多 >