2014-01-18 19 views
2

我正在嘗試將一組數組轉換爲一個矩陣,該矩陣本質上就是一組項目的指標矩陣。如何矢量化python中的一組項目

我現在有的N項

A_ = [A,B,C,D,E,...,Y,Z] 

另外一個陣列中,我有爲S陣列(目前存儲在數組中)具有與項的子集在矢量A.

B_ = [A,B,C,Z] 
C_ = [A,B] 
D_ = [D,Y,Z] 

它們存儲在將在陣列狀結構如此:

X = [B_,C_,D_] 

我想轉換數據轉換成指標矩陣,以便於操作。它會非常像這樣(這將是一個N個S級矩陣):

[1,1,1,0,...,0,1] 
[1,1,0,0,...,0,0] 
[0,0,0,1,...,1,1] 

我知道我怎麼會用一個for循環通過這個迭代並創建矩陣,但我想知道如果有一個更有效率/語法簡單的方法來解決這個問題。

+3

你是否熟悉[NumPy](http://www.numpy.org)? – MattDMo

回答

1

一個簡潔的方法是使用一個list comprehension.

# Create a list containing the alphabet using a list comprehension 
A_ = [chr(i) for i in range(65,91)] 

# A list containing two sub-lists with some letters 
M = [["A","B","C","Z"],["A","B","G"]] 

# Nested list comprehension to convert character matrix 
# into matrix of indicator vectors 
I_M = [[1 if char in sublist else 0 for char in A_] for sublist in M] 

最後一行是有點密集,如果你不熟悉的內涵,但它不是太棘手,一旦你把它拆開。內部分...

[1 if char in sublist else 0 for char in A_] 

這本身就是一個列表理解,它會創建一個包含1對在A_所有字符(char),這也在sublist發現了一個列表,和0爲sublist沒有找到的字符。

外位...

[ ... for sublist in M] 

只是運行每個sublist內部列表理解在M發現,導致由存儲在I_M內部列表理解創建的所有子列表的列表。

編輯:

雖然我試圖保持這個例子簡單,值得注意的是(如DSM和jterrace點出),其testing membership in vanilla arrays is O(N)。將其轉換爲類似散列的結構(如Set)將加速檢查大型子列表。

+0

這是'O(N^2)' – jterrace

+2

你可以將'1如果在子列表其他0中的字符'濃縮到'int(子列表中的字符)'。你也可以通過在map(set,M)中使用''subset'來加快它的速度(對於大S),因爲測試一個大集合中的成員資格比一個大列表更快。 – DSM

+0

好點,編輯。 –

0

使用numpy的:

>>> import numpy as np 
>>> A_ = np.array(['A','B','C','D','E','Y','Z']) 
>>> B_ = np.array(['A','B','C','Z']) 
>>> C_ = np.array(['A','B']) 
>>> D_ = np.array(['D','Y','Z']) 
>>> X = [B_,C_,D_] 
>>> matrix = np.array([np.in1d(A_, x) for x in X]) 
>>> matrix.shape 
(3, 7) 
>>> matrix 
array([[ True, True, True, False, False, False, True], 
     [ True, True, False, False, False, False, False], 
     [False, False, False, True, False, True, True]], dtype=bool) 

這是O(NS)