gpt4 book ai didi

python - 有效地将 3D Numpy 数组 reshape 为 1D 列表加坐标向量

转载 作者:行者123 更新时间:2023-11-28 18:34:02 24 4
gpt4 key购买 nike

我有一个大型嵌套数组 a (256x256x256),我需要将其重组为包含如下元素的列表:

[ (i,j,k), a[i,j,k] ]

我目前的做法如下:

aflat = a.flatten().tolist()
coords = list(itertools.product(range(256), repeat=3))
thelist = [list(x) for x in zip(coords, aflat)]

这可行,但速度相当慢。

我可以通过删除坐标向量的运行时生成并从文件中读取它们来节省一秒钟左右的时间。然而,主要的减速似乎出现在最后一行,它的计时时间超过 6 秒。

在 Python 中有没有更快的方法来生成我需要的数据结构?

最佳答案

正如@P-i 评论的那样,主要问题是代码创建了大量列表,而 Python 花费大量时间进行内存管理。为了消除这种情况,您可以使用 numpy 数组来预分配数据,并使用其 repeattile 函数生成 i,j,k值(value)观:

# order='F' is important here so column-wise assignment can
# occur with a stride of 1. Switching the order results
# in a significant performance hit.
coords = numpy.zeros([a.size,4],'d',order='F')

NI, NJ, NK = a.shape

# build columns for (i,j,k) tuples using repeat and tile
coords[:,0] = numpy.repeat(range(NI),NJ*NK)
coords[:,1] = numpy.tile(numpy.repeat(range(NJ),NK), NI)
coords[:,2] = numpy.tile(range(NK), NI*NJ)
coords[:,3] = a.flatten()

这会生成一个数组,其中每一行都是 (i,j,k,value)。它确实假定您的原始数组位于 row-major 中排序(numpy 中的 C 排序数组)。

根据我的计时,基于 2013 年 MacBook Pro 上 Python 3.5 的十次迭代,每次转换大约需要 20 秒来运行 OP 的转换,而使用这种方法每次转换只需要大约 8 秒。

输出格式确实必须是列表,数组可以在最后一步转换为列表。但是,在我的测试中,这将每次转换的转换时间增加到 13 秒。

关于python - 有效地将 3D Numpy 数组 reshape 为 1D 列表加坐标向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34125662/

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