Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 在屏蔽数组中形成项索引,计算原始排序数组中相同项的索引_Python_Arrays_Performance_Numpy_Processing Efficiency - Fatal编程技术网

Python 在屏蔽数组中形成项索引,计算原始排序数组中相同项的索引

Python 在屏蔽数组中形成项索引,计算原始排序数组中相同项的索引,python,arrays,performance,numpy,processing-efficiency,Python,Arrays,Performance,Numpy,Processing Efficiency,我使用下面的方法屏蔽了一个排序的1-D numpy数组(遵循一个建议的解决方案): python方法在索引idx上屏蔽后返回数组。例如,如果sorted=np.array([0.1,0.2,0.3.0.4,0.5])和idx=np.array([4,0,1]),那么方法get\u from\u sorted应该返回np.array([0.1,0.2,0.5])(注意原始数组中的顺序被保留) 问:我需要获得掩蔽后数组中的项的索引与原始列表中的项的索引之间的映射。在上面的示例中,这样的映射是 0 -

我使用下面的方法屏蔽了一个排序的1-D numpy数组(遵循一个建议的解决方案):

python方法在索引
idx
上屏蔽后返回数组。例如,如果sorted=
np.array([0.1,0.2,0.3.0.4,0.5])
和idx=
np.array([4,0,1]
),那么方法
get\u from\u sorted
应该返回
np.array([0.1,0.2,0.5])
(注意原始数组中的顺序被保留)

问:我需要获得掩蔽后数组中的项的索引与原始列表中的项的索引之间的映射。在上面的示例中,这样的映射是

0 -> 0
1 -> 1
2 -> 5
因为0.1、0.2和0.5在排序的
中分别位于第0、第1和第5位

如何有效地编程此映射

效率要求:效率是我解决问题的关键。这里,“idx”和“sorted”都是100万个元素的一维数组,idx是大约50万个元素的一维数组(取自图像处理应用程序)。因此,在我的例子中,使用np.where逐个或以向量化的方式对照原始数组检查屏蔽数组的元素不会很好地执行。理想情况下,屏蔽数组和原始排序数组中的索引之间应该有一个相对简单的数学关系。有什么想法吗?

我假设(从您的示例中)原始列表就是已排序的列表。在这种情况下,除非我误解了,否则您只需:

idx.sort()
然后映射为
i->idx[i]

当然,如果idx的原始顺序很重要,请先复制一份。

我假设(从您的示例中)原始列表就是排序列表。在这种情况下,除非我误解了,否则您只需:

idx.sort()
然后映射为
i->idx[i]


当然,如果idx的原始顺序很重要,请先复制一份。

我不清楚一个问题。它可以有几种解释

掩码->idx(按升序排列): 让我试试这个相当大的数据集(1000万个值,其中10%是
真的
):

在这种情况下,使用
np。其中
非常有效:

%timeit np.where(x)[0]
%timeit x.nonzero()[0]
%timeit np.arange(len(x))[x]
24.8 ms ± 551 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
24.5 ms ± 229 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
52.4 ms ± 895 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
已排序->idx的随机项(升序): 如果您丢失了对需要从
排序的
中获取的项目位置的任何引用,如果没有重复的项目,您仍然可以找到
idx
。这是
O(n logn)

idx(按任何顺序)->idx(按升序) 这很简单:

x = np.arange(10000000)
np.random.shuffle(x)
idx = x[:1000000] #input data: first 1M of random idx
%timeit np.sort(idx) #output data
65.3 ms ± 316 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

有一个问题我不清楚。它可以有几种解释

掩码->idx(按升序排列): 让我试试这个相当大的数据集(1000万个值,其中10%是
真的
):

在这种情况下,使用
np。其中
非常有效:

%timeit np.where(x)[0]
%timeit x.nonzero()[0]
%timeit np.arange(len(x))[x]
24.8 ms ± 551 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
24.5 ms ± 229 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
52.4 ms ± 895 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
已排序->idx的随机项(升序): 如果您丢失了对需要从
排序的
中获取的项目位置的任何引用,如果没有重复的项目,您仍然可以找到
idx
。这是
O(n logn)

idx(按任何顺序)->idx(按升序) 这很简单:

x = np.arange(10000000)
np.random.shuffle(x)
idx = x[:1000000] #input data: first 1M of random idx
%timeit np.sort(idx) #output data
65.3 ms ± 316 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

我漏掉了一点。什么是预期的输入和输出?同样
0.5
不是第5项,而是第4项。我遗漏了一点。什么是预期的输入和输出?同样
0.5
不是第5项,而是第4项。