3 回答
TA贡献2016条经验 获得超9个赞
有一个问题我不清楚。它可以有多种解释。
mask -> idx(按升序排列):
让我尝试一下这个相当大的数据集(10M 的值,其中 10% 是True):
x = np.random.choice(a=[False, True], size=(10000000,), p=[0.9, 0.1])
在这种情况下,使用np.where是非常有效的:
%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 (按升序):
如果您丢失了对需要从中获取的项目位置的任何引用sorted,您仍然可以查找idx是否没有重复的项目。这是O(n logn):
x = np.random.choice(a=[False, True], size=(10000000,), p=[0.9, 0.1])
arr = np.linspace(0,1,len(x))
sub_arr = arr[x] %input data: skipping 90% of items
%timeit np.searchsorted(arr, sub_arr) %output data
112 ms ± 2.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
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)
TA贡献1842条经验 获得超21个赞
如果您需要知道屏蔽条目的来源,可以使用np.where
、np.nonzero
或 之一np.flatnonzero
。但是,如果您只需要获取索引子集的起源,则可以使用我最近作为库的一部分编写的函数 haggis: 1。haggis.npy_util.unmasked_index
给定mask
一些掩码元素的索引,您可以使用以下命令检索原始位置的多维索引
unmasked_index(idx, mask)
如果您需要它,还有一个反函数haggis.npy_util.masked_index
,可以将多维输入数组中的位置转换为其在掩码数组中的索引。
TA贡献1843条经验 获得超7个赞
我假设(根据您的示例)原始列表是排序列表。在这种情况下,除非我误解了,否则你只需这样做:
idx.sort()
然后映射是i-> idx[i]
当然,如果原始顺序idx
很重要,请先复制一份。
添加回答
举报