【问题标题】:How to efficiently work with large complex numpy arrays?如何有效地处理大型复杂的 numpy 数组?
【发布时间】:2017-05-17 12:42:27
【问题描述】:

对于我的研究,我正在处理由复杂数据组成的大型 numpy 数组。

arr = np.empty((15000, 25400), dtype='complex128')
np.save('array.npy'), arr)

存储时,它们每个大约 3 GB。加载这些数组是一个耗时的过程,这让我想知道是否有办法加快这个过程

我想到的一件事是将数组拆分为复杂的实数部分:

arr_real = arr.real 
arr_im = arr.imag

并分别保存每个部分。但是,这似乎并没有显着提高处理速度。有一些关于处理大型数组的文档,但我没有找到太多关于处理复杂数据的信息。是否有更聪明的方法来处理大型复杂数组?

【问题讨论】:

  • 如果您有很多0 (~70+%),您可以将realimage 部分分别保存(使用float64 dtype)作为sparse 数组 - 这将显着减少这些数组在内存和磁盘上的大小
  • 向/从磁盘写入或加载 3GB 需要一段时间,通常没有真正的解决方法。但是,根据数据有两种可能性:1. 如果数据包含许多零,您可以使用sparse representation(如上所述)。 2. 如果数据高度结构化,compression 可能会缓解 i/o 瓶颈。
  • 感谢您的回答。不幸的是,数据由雷达图像组成,它们不是稀疏或结构化的。我将尝试用不同的方式保存和加载数组。
  • @kwant 图像通常非常适合压缩,但我猜雷达图像嘈杂,这可能是个问题。你试过了吗?我会对结果感兴趣。

标签: python arrays numpy complex-numbers memory-efficient


【解决方案1】:

如果你只需要内存中的部分数组,你可以使用memory mapping加载它:

arr = np.load('array.npy', mmap_mode='r')

来自文档:

内存映射数组保存在磁盘上。但是,它可以访问并 像任何 ndarray 一样切片。内存映射对于 访问大文件的小片段而不读取整个文件 文件到内存中。

【讨论】:

  • 我认为这可能很有用,因为我正在逐步处理每个图像的一部分。
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多