3 回答

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
有一個(gè)問(wèn)題我不清楚。它可以有多種解釋。
mask -> idx(按升序排列):
讓我嘗試一下這個(gè)相當(dāng)大的數(shù)據(jù)集(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)
排序的隨機(jī)項(xiàng) -> idx (按升序):
如果您丟失了對(duì)需要從中獲取的項(xiàng)目位置的任何引用sorted,您仍然可以查找idx是否沒(méi)有重復(fù)的項(xiàng)目。這是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(升序)
這很簡(jiǎn)單:
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貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超22個(gè)贊
如果您需要知道屏蔽條目的來(lái)源,可以使用np.where
、np.nonzero
或 之一np.flatnonzero
。但是,如果您只需要獲取索引子集的起源,則可以使用我最近作為庫(kù)的一部分編寫的函數(shù) haggis:?1。haggis.npy_util.unmasked_index
給定mask
一些掩碼元素的索引,您可以使用以下命令檢索原始位置的多維索引
unmasked_index(idx,?mask)
如果您需要它,還有一個(gè)反函數(shù)haggis.npy_util.masked_index
,可以將多維輸入數(shù)組中的位置轉(zhuǎn)換為其在掩碼數(shù)組中的索引。

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
我假設(shè)(根據(jù)您的示例)原始列表是排序列表。在這種情況下,除非我誤解了,否則你只需這樣做:
idx.sort()
然后映射是i-> idx[i]
當(dāng)然,如果原始順序idx
很重要,請(qǐng)先復(fù)制一份。
添加回答
舉報(bào)