首页 > 解决方案 > 使用集合中的组件创建 3D numpy 向量数组

问题描述

我有一个浮动列表 x1,...,xN。我想创建维度为 NxNxN 的 3D numpy 数组,使得元素 i、j、k 是 3 元素元组 x_i、x_j、x_k。所以它是一个立方体,每个网格站点都定义了一个向量。

示例:如果 x1,...,xN=0,1 我希望创建的 2x2x2 网格是

layer 0: 
(0,0,0), (1,0,0)
(0,1,0), (1,1,0)

layer 1: 
(0,0,1), (1,0,1)
(0,1,1), (1,1,1)

如果 x1,...,xN 为 0,...,N-1,那么这很容易实现:

np.indices((N,N,N)).swapaxes(0,3).swapaxes(0,1).swapaxes(1,2)

对于通用列表 x1,...,xN,创建所需数组的最快方法是什么?

我对 N=2k 和 x1,...,xN 为 0,1,...,k-1,-k,-k+1,...,-1 的可能不太通用的情况特别感兴趣此排序来自 numpy.fft 如何返回 FFT 的频率。

对于特定的 x1,...,xN,您可以使用上面的代码行,然后逐个组件执行适当的移位向量,但我不确定这是最快的方法,以及如何在最快的方式。

标签: pythonnumpy

解决方案


创建索引 ( np.indices((N,N,N))) 花费了大部分时间,我发现没有更快的方法来创建索引(例如meshgrid慢得多)。

我建议的只是稍微快一点的转置方式(为了干净的代码而更多地提出这个建议):

np.indices((N,N,N)).transpose(1, 2, 3, 0)

如果您经常创建这样的索引网格,您总是可以缓存您的结果并在以后重新使用它们。


推荐阅读