2012-09-12 48 views
1

我有一個numpy數組y [1,2,3,4,5,6,1,2,3,4,5,6]按值掩蓋數組然後掩碼相應的矩陣

然後我有一個矩陣X是一個numpy csr格式。

1)我需要在y中掩蓋元素6。然後,我需要屏蔽X中的對應行。

所以,y.shape是12.應該是10.X是12,20。應該是10,20。

如何做到這一點的numpy的

回答

0

我不是100%肯定我明白你的問題,但也許這將是有益的:

>>> import numpy as np 
>>> a = np.array(range(1,7)*2) #Your array. 
>>> a 
array([1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]) 
>>> b = np.array(list(a)*20).reshape(12,20) #just some matrix of right size and shape. np.empty(12,20) would probably work just as well. 
>>> b 
array([[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2], 
     [3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4], 
     [5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6], 
     [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2], 
     [3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4], 
     [5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6], 
     [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2], 
     [3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4], 
     [5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6], 
     [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2], 
     [3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4], 
     [5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]]) 


>>> mask = a != 6 #mask. True for all points except ones where value == 6. 
>>> b[mask,:] #take points along first axis where mask==True, all points along second axis. 
array([[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2], 
     [3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4], 
     [5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6], 
     [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2], 
     [3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4], 
     [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2], 
     [3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4], 
     [5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6], 
     [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2], 
     [3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4]]) 
0

使用nonzero

(假設X已被定義)

import numpy as np 
y = np.array([1,2,3,4,5,6,1,2,3,4,5,6]) 
keepers = np.nonzero(y != 6) 
y = y[keepers] 
x = x[keepers, :] 
+0

我錯過了,你說你的矩陣是CSR。不知道這是否有效,但給它一個鏡頭,我想... – acjay

+0

是啊..不適合csr。 – Tampa

1

如果你的「屏蔽」輸出y應該比你的輸入更小的,你沒有真正使用口罩。

正如你previous question建議,你真的可以很容易地找到它y爲6

condition = (y != 6) 

不同這是abool數組,你可以使用不6

檢索的 y值指數
y = y[condition] 

您可以使用相同的condition來獲得X的相應行,但它是CSR,因此不支持花哨索引格式ING。你仍然可以將它轉換成LIL然後返回。

你也可以得到指數這y !=6

(indices,) = np.nonzero(y != 6) 

這是一個普通的整數數組,您可以使用索引你X

+0

我不是csr而是bool的索引嗎?我可以獲得filered out Y值的索引並用於篩選X crs嗎? – Tampa

+0

你不需要索引,你可以直接用布爾數組索引。如果你真的想要索引,你可以使用'np.nonzero(y!= 6)',但你仍然會使用花式索引,你的'X'矩陣將不支持... –

+0

我的X是(14259 ,50042)太大以至於無法裝入內存。 – Tampa

1

我不喜歡回答我自己的問題,但得到妥善解決是本作處理一個CSR矩陣:

X = X[np.where(y != 6)[0]] 
y = y[y != 6]