Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy中一维到三维索引对应的高效算法_Python_Arrays_Performance_Algorithm_Numpy - Fatal编程技术网

Python numpy中一维到三维索引对应的高效算法

Python numpy中一维到三维索引对应的高效算法,python,arrays,performance,algorithm,numpy,Python,Arrays,Performance,Algorithm,Numpy,我正在尝试建立一个3d单元格的规则网格和这些单元格的一维索引之间的对应关系。所以我想要一种在三个整数(I,j,k)和整数cellnum之间来回映射的方法。此映射的速度至关重要 问题说明: 假设三维长方体的每个维度都划分为num_divs单元格。然后,通过以下numpy索引技巧,使从(i,j,k)到单元的唯一字典顺序索引的映射变得闪电般快速: indexing_array = np.arange(num_divs**3).reshape((num_divs, num_divs, num_divs)

我正在尝试建立一个3d单元格的规则网格和这些单元格的一维索引之间的对应关系。所以我想要一种在三个整数(I,j,k)和整数cellnum之间来回映射的方法。此映射的速度至关重要

问题说明:

假设三维长方体的每个维度都划分为num_divs单元格。然后,通过以下numpy索引技巧,使从(i,j,k)到单元的唯一字典顺序索引的映射变得闪电般快速:

indexing_array = np.arange(num_divs**3).reshape((num_divs, num_divs, num_divs))
例如,假设我们有以下数组存储NPT点的x、y和z单元索引:

存储每个三元组的cellnum的数组可以通过以下方式非常高效地计算:

output_cellnum_array = indexing_array[xidx, yidx, zidx]
输出cellnum数组是Npts点的一维数组。每个值都是一个整数,存储每个(i,j,k)三元组的字典顺序。上面这一行在我的笔记本电脑上只需要40毫秒,这是我针对以下问题的目标基准:

问题:

我如何才能在反向行驶时达到相同的速度水平?给定一个一维整数数组,输入_cellnum_数组,如何以相当的速度计算数组xidx、yidx、zidx

不可行的缓慢解决方案:

使用以下函数运行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

我想你正在寻找和。当
numpy.undravel_索引
将一维索引映射到多维索引时,
numpy.ravel_多维索引
将多维索引转换为一维索引:

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])

明亮的你说得对,@plonser-这正是我要找的!天啊,努比真是太棒了。非常感谢。
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])