我正在尝试在3d单元格的常规网格和这些单元格的1d索引之间建立对应关系。所以我想要一种在整数三元组( i,j,k )和整数 cellnum 之间来回映射的方法。此映射的速度至关重要。
问题说明:
假设3d框的每个维度都分为 num_divs 个单元格。然后,从( i,j,k )到单元格的唯一字典顺序索引的映射通过以下numpy索引技巧快速闪现:
indexing_array = np.arange(num_divs**3).reshape((num_divs, num_divs, num_divs))
例如,假设我们有以下数组存储 Npts 点的x,y和z单元索引:
Npts = 1e6
xidx = np.random.random_integers(0, num_divs-1, Npts)
yidx = np.random.random_integers(0, num_divs-1, Npts)
zidx = np.random.random_integers(0, num_divs-1, Npts)
存储每个三元组的 cellnum 的数组可以通过以下方式非常有效地计算:
output_cellnum_array = indexing_array[xidx, yidx, zidx]
output_cellnum_array 是 Npts 点的一维数组。每个值都是一个整数,存储每个( i,j,k )三元组的字典顺序。我的笔记本电脑上面只需要40毫秒,我的目标基准是以下问题:
问题:
如何以相反的方向达到相同的速度?给定一维整数数组 input_cellnum_array ,如何以相当的速度计算数组 xidx,yidx,zidx ?
UNWORKABLY SLOW SOLUTION:
使用以下函数运行for循环会返回正确的结果,但对于我的应用程序来说,数量级太慢:
def reverse_indexer(single_cellnum, num_divs):
i = single_cellnum/(num_divs*num_divs)
remainder = single_cellnum - (num_divs*num_divs*i)
j = remainder/num_divs
remainder -= j*num_divs
k = remainder % num_divs
return i, j, k
答案 0 :(得分:4)
我认为您正在寻找numpy.unravel_index和numpy.ravel_multi_index。当numpy.unravel_index
将1d索引映射到多维索引时,numpy.ravel_multi_index
将多维索引转换为1d索引:
id_1d = np.arange(9)
# getting the indices of the multi-dimensional array
idx,idy,idz = np.unravel_index(id_1d,(3,3,3))
(idx,idy,idz)
(array([0, 0, 0, 0, 0, 0, 0, 0, 0]),
array([0, 0, 0, 1, 1, 1, 2, 2, 2]),
array([0, 1, 2, 0, 1, 2, 0, 1, 2]))
# getting the 1d indecis
np.ravel_multi_index((idx,idy,idz),(3,3,3))
array([0, 1, 2, 3, 4, 5, 6, 7, 8])