2017-05-23 64 views
1

我正在嘗試創建僅包含某些值的numpy數組副本。這是我正在使用的代碼:在numpy數組中高效查找值

A = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
query_val = 5 
B = (A == query_val) * np.array(query_val, dtype=np.uint16) 

......這正是我想要的。

現在,我想query_val不僅僅是一個值。這裏的答案是:Numpy where function multiple conditions建議使用邏輯和操作,但這是非常低效的空間,因爲您多次使用==,創建多箇中間結果。

在我的情況下,這意味着我沒有足夠的內存來完成它。有沒有一種方法在原生numpy中以最小的空間開銷正確執行此操作?

+1

莫不是在'A'重複? – Divakar

+0

是的,會有重複。 – fns

回答

0

下面是使用np.searchsorted一個方法 -

def mask_in(a, b): 
    idx = np.searchsorted(b,a) 
    idx[idx==b.size] = 0 
    return np.where(b[idx]==a, a,0) 

採樣運行 -

In [356]: a 
Out[356]: 
array([[5, 1, 4], 
     [4, 5, 6], 
     [2, 4, 9]]) 

In [357]: b 
Out[357]: array([2, 4, 5]) 

In [358]: mask_in(a,b) 
Out[358]: 
array([[5, 0, 4], 
     [4, 5, 0], 
     [2, 4, 0]]) 
+0

謝謝。雖然,如果我看到這個正確的話,這需要多次分配全尺寸數組的空間(1. a,2. idx,3. idx == b.size,4. b [idx],5. b [idx] == a,6. np.where(...)),而我的代碼需要2個全尺寸分配。 – fns

+0

@fns如果不需要副本作爲輸出,我們可以使用掩碼'b [idx] == a'輕鬆地將結果寫回到輸入數組。那麼,你想要一個副本還是回寫? – Divakar

+0

@fns除此之外,我們有'idx'和'b [idx]'的內存佔用。因爲,我們在'a'中有重複,所以不會有簡單的解決方案。如果記憶對你來說是超級重要的,我認爲你應該堅持一個循環的解決方案。 – Divakar