3 回答

TA貢獻2016條經驗 獲得超9個贊
有一個問題我不清楚。它可以有多種解釋。
mask -> idx(按升序排列):
讓我嘗試一下這個相當大的數(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)
排序的隨機項 -> 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
。但是,如果您只需要獲取索引子集的起源,則可以使用我最近作為庫的一部分編寫的函數(shù) haggis:?1。haggis.npy_util.unmasked_index
給定mask
一些掩碼元素的索引,您可以使用以下命令檢索原始位置的多維索引
unmasked_index(idx,?mask)
如果您需要它,還有一個反函數(shù)haggis.npy_util.masked_index
,可以將多維輸入數(shù)組中的位置轉換為其在掩碼數(shù)組中的索引。

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