2017-08-26 111 views
2

假設我有一個numpy的陣列讓numpy的矩陣更稀疏

np.array([ 
    [3, 0, 5, 3, 0, 1], 
    [0, 1, 2, 1, 5, 2], 
    [4, 3, 5, 3, 1, 4], 
    [2, 5, 2, 5, 3, 1], 
    [0, 1, 2, 1, 5, 2], 
]) 

現在,我想隨機替換0。所以一些元素,我有這樣的

np.array([ 
    [3, 0, 0, 3, 0, 1], 
    [0, 1, 2, 0, 5, 2], 
    [0, 3, 0, 3, 1, 0], 
    [2, 0, 2, 5, 0, 1], 
    [0, 0, 2, 0, 5, 0], 
]) 
+1

產生['mcve'](https://stackoverflow.com/help/mcve)? – Divakar

+0

如果您有MovieLens100K數據集,則可以運行此代碼。從這裏下載files.grouplens.org/datasets/movielens/ml-100k.zip – partoftheorigin

+1

不需要。**您需要提供** [mcve] –

回答

6

我們可以輸出使用np.random.choice(..., replace=False)來隨機選擇一些獨特的非零平展索引,然後簡單地索引和重置輸入數組中的索引。

因此,一種解決方案將是 -

def make_more_sparsey(a, n): 
    # a is input array 
    # n is number of non-zero elements to be reset to zero 
    idx = np.flatnonzero(a) # for performance, use np.flatnonzero(a!=0) 
    np.put(a, np.random.choice(idx, n, replace=False),0) 
    return a 

樣品運行 -

In [204]: R = np.array([ 
    ...:  [3, 0, 5, 3, 0, 1], 
    ...:  [0, 1, 2, 1, 5, 2], 
    ...:  [4, 3, 5, 3, 1, 4], 
    ...:  [2, 5, 2, 5, 3, 1], 
    ...:  [0, 1, 2, 1, 5, 2], 
    ...: ]) 

In [205]: make_more_sparsey(R, n=5) 
Out[205]: 
array([[3, 0, 5, 3, 0, 1], 
     [0, 1, 0, 0, 5, 2], 
     [4, 3, 5, 3, 1, 4], 
     [2, 5, 0, 5, 3, 1], 
     [0, 1, 0, 1, 0, 2]]) 
+0

這很好。 – sascha

+0

@partoftheorigin如果'R'是你的輸入數組,那麼就執行'np.put(R,np.random.choice(idx,n,replace = 0),0)'。不要這樣做:'a = np.put(R ..)'。我假設'a'作爲輸入數組。最終的結果將是一個更加稀疏的'R'。 – Divakar

+0

謝謝Divakar! – partoftheorigin

0

使用np.ravelravel方法來創建平坦化。請注意,flatten方法總是創建一個副本,所以變異將不起作用。

a = np.array([ 
    [3, 0, 5, 3, 0, 1], 
    [0, 1, 2, 1, 5, 2], 
    [4, 3, 5, 3, 1, 4], 
    [2, 5, 2, 5, 3, 1], 
    [0, 1, 2, 1, 5, 2], 
]) 
r = a.ravel() 
r[random.randrange(0, len(r))] = 0