2012-09-12 68 views
1

很難解釋我正在用單詞做什麼,所以這裏是一個例子。生成一個將一個數組索引到另一個數組中的布爾掩碼

比方說,我們有以下輸入:

In [76]: x 
Out[76]: 
0 a 
1 a 
2 c 
3 a 
4 b 

In [77]: z 
Out[77]: ['a', 'b', 'c', 'd', 'e'] 

我想:

In [78]: ii 
Out[78]: 
array([[1, 0, 0, 0, 0], 
     [1, 0, 0, 0, 0], 
     [0, 0, 1, 0, 0], 
     [1, 0, 0, 0, 0], 
     [0, 1, 0, 0, 0]]) 

ii是布爾口罩的數組,它可以應用到z找回原來的x

我目前的解決方案是寫它轉換zlist並使用index方法獲取該元素的索引在z,然後生成零的行除了其中存在一個索引的函數。該函數應用於每行x以獲得所需的結果。

+0

所以,什麼是你的問題?寫這個函數?當然,像'np.choose([「abcde」.index(i)for i in x],「abcde」)'不適合你? –

+0

嗯,當我運行你的行時,我得到'array(['a','a','c','a','b'],dtype ='| S1')'。我想要的是'['a','a','c','a','b']'的掩碼(5個布爾元素的列表)。這是否更清楚? –

+1

你正在尋找一個更快的方式,或者只是簡短的類型,如:np.array([[j = i] for i in x],dtype = int) –

回答

1

第一種可能性:

>>> choices = np.diag([1]*5) 
>>> choices[[z.index(i) for i in x]] 

正如其他地方所指出,可以通過np.searchsorted(z, x)

>>> choices[np.searchsorted(z, x)] 

需要注意的是,通過@seberg在評論所說,你應該使用np.eye(len(x)),而不是改變列表理解[z.index(i) for i in x]np.diag([1]*len(x))np.eye函數直接爲您提供了一個二維數組,其中1對角線和0其他地方。

+0

The第一個是我正在尋找的。 –

+2

而不是'np.diag([1] * 5)',而是使用'np.eye(5)'我想。 – seberg

1

對於z被排序的情況,這是numpy方法。你沒有specifiy那......如果大熊貓需要一些不同的東西,我不知道:

# Assuming z is sorted. 
indices = np.searchsorted(z, x) 

現在我真的不知道爲什麼你想要一個布爾面具,這些指標可以被應用到z給回x已經更緊湊。

z[indices] == x # if z included all x. 
+0

不幸的是,他們沒有排序,我的例子是誤導。另外我需要這些蒙版,因爲之後我將它們乘以一些概率矩陣:https://www.kaggle.com/c/predict-closed-questions-on-stack-overflow/forums/t/2644/multi-class-登錄丟失功能 –

+0

如果它們是唯一的,請先自己排序,如果你關心速度。至於創建布爾數組,我會建議像'a = np.zeros((...,...),dtype = bool); a [np.ix_ [np.arange(...),z]] = 1'也許。但沒關係。 – seberg

+0

如果我將它們排序,那麼我將不得不排序所有其他數組和矩陣的列,我必須匹配。不知道它是否值得。 –

1

驚訝沒有人提到的numpy.equalouter方法:

In [51]: np.equal.outer(s, z) 
Out[51]: 
array([[ True, False, False, False, False], 
     [ True, False, False, False, False], 
     [False, False, True, False, False], 
     [ True, False, False, False, False], 
     [False, True, False, False, False]], dtype=bool) 

In [52]: np.equal.outer(s, z).astype(int) 
Out[52]: 
array([[1, 0, 0, 0, 0], 
     [1, 0, 0, 0, 0], 
     [0, 0, 1, 0, 0], 
     [1, 0, 0, 0, 0], 
     [0, 1, 0, 0, 0]]) 
相關問題