【发布时间】:2020-03-08 16:44:52
【问题描述】:
我有一个由大约 63M 个整数元素组成的 1D 数组,它代表一个 4D 数据集,轴为 x、y、通道、帧(所有正整数)。数据集的形状为 (512, 512, 4069, 239)。该数据集代表一个 X 射线光谱流,其中 x 和 y 是电子束光栅位置索引,每个通道代表一个 X 射线能量箱。样本被扫描多次,每一帧代表这样一个(x,y,通道)数据集。
为了能够轻松地操作此数据并通过各个轴对其进行切片,最好将数据转换为 4D 数据集或能够动态创建 3D 切片。
一维数组中的数据结构如下:每个元素要么是一个非常大的整数 x(大约 65000),要么是一个表示通道索引的整数(最大为 4069)。数组中存储的每个x对应一个扫描位置(x,y),所以第一个x代表(0,0),第二个(1,0),等等。扫描网格的形状为 512x512 像素,因此一旦达到 (511,0),下一个 x 对应于 (0, 1)。如果遇到 x 以外的其他值,则表示与这些值对应的通道在与前面的 x 对应的光束位置 (x,y) 处接收到计数。一旦超过索引 (511,511),下一帧开始。该阵列非常稀疏,因为在每一帧中总共只有大约 3000 个 X 射线计数,分布在 4069 个通道上。所以一维数组基本上是 239 帧,每帧用 512x512 + ~3000 个整数表示,全部串在一起。
为了说明,一维数据集可能看起来像
[65000, 65000, 1, 65000, 65000, 65000, 2, 3, 65000, 2, 2, 65000, 65000, ...]
这应该被解释为
Frame 1
| Channel
x y | 1 2 3 ... 4069
_____________________________
0 0 | 0 0 0
1 0 | 1 0 0
2 0 | 0 0 0
3 0 | 0 0 0
4 0 | 0 1 1
5 0 | 0 2 0
6 0 | 0 0 0
7 0 | 0 0 0
... |
511 511|
Frame 2
...
Frame 239
...
我想做什么:
- 重新创建完整的 4D 数据集以查看它是否适合内存并可以使用。我怀疑它需要的内存量是一维数组所需内存量的 4069 倍。
- 动态创建一帧的 (x , y, 通道) 切片
- 创建一个对帧求和的 (x, y, channel) 数组
我知道如何使用循环来做到这一点,但我担心我会开始遇到内存或性能问题。即使我不为这个数据集,未来的数据集可能会更大,所以我想从一开始就以正确的方式去做。
我的问题是:有没有一种很好的 Pythonic 高效的方法来进行这种类型的数据转换?避免所有元素循环的东西?
我还希望获得有关易于处理数据同时仍保持良好性能和管理内存的最佳做法的提示。最好存储整个 4D 数据集并对其执行切片和操作,还是只存储 1D 数组并在需要进行某些计算时进行逐帧转换?鉴于数据非常稀疏,是否有另一种存储数据的方法,这样它会比 4D 数组占用更少的内存,但仍然可以轻松查看/访问/操作?
【问题讨论】:
标签: python arrays memory transformation large-data