2016-12-22 13 views
1

問題があります。私はそれを記述する方法がわからないので理解しています。 私は例を挙げるつもりです。 我々はpythonでこの配列(B)を持っているとしましょう:python - 2つの行列の要素の組み合わせ

[[ 1 1] 
[ 7 11] 
[1 20] 
[20 1] 
[26 11] 
[31 11]] 

最初の列は、ユーザーを表します。 2番目のタグ。 ここでは、エッジが存在する「1」を持つマトリックスを作成します。それ以外の場合は「0」です。 私が書く場合我々は ...それは6 * 5行列で、respectevily 5と4つの異なるユーザーとタグを持っている:

zero = np.zeros((6,5,).astype(int) #it needs one more row and column 
for line in B: 
if line[2]: 
    zero[line[0],line[1]] = 1 

エラーは次のとおりです。

zero[line[0],line[1]] = 1 

はIndexError:インデックス7が出ています私は要素 "31"を5番目の行、要素 "11"を4番目の列にしたいので、2つの行列の組み合わせを作るにはどうすればよいですか?下記に記載されているあなたの最初の試み、近くに泊まる

+2

希望の出力をマトリックス形式で表示できますか? – Shijo

+0

なぜマトリックス6 * 5ですか? – martianwars

+0

あなたはタグが3つしかありません – kezzos

答えて

3

使用パンダとnumpyの

>>>import numpy as np 
>>>import pandas as pd 
>>> tagsArray = np.unique([1,11,20,1,11,11]) 
>>> userArray = np.unique([1,7,20,26,31]) 
>>> aa = [[ 1,1],[ 7, 11],[1, 20],[20, 1],[26, 11],[31, 11]] 
>>> df = pd.DataFrame(index=userArray,columns=tagsArray) 
>>> for s in aa: 
...  df.loc[s[0],s[1]] = 1 
... 
>>> df.fillna(0,inplace=True) 
>>> df 
    1 11 20 
1  1 NaN 1 
7 NaN 1 NaN 
20 1 NaN NaN 
26 NaN 1 NaN 
31 NaN 1 NaN 
+1

そして 'df.fillna(0、inplace = True)'です。 – DyZ

0

はnumpyのベースのアプローチです。これらの2つの列にnp.unique(..,return_inverse=1)を使用すると、出力にインデックスを付けるためにそれぞれ行と列のインデックスとして使用できる一意のIDを得ることができます。その後、単純に出力配列を初期化し、その配列にインデックスを付けて、希望の結果を得ます。

したがって、実装は次のようになり -

r,c = [np.unique(i,return_inverse=1)[1] for i in B.T] 
out = np.zeros((r.max()+1,c.max()+1),dtype=int) 
out[r,c] = 1 

あるいは、rcを得るために、より明示的な方法が非常にようになる -

r = np.unique(B[:,0],return_inverse=1)[1] 
c = np.unique(B[:,1],return_inverse=1)[1] 

サンプル入力、出力 -

In [27]: B # Input array 
Out[27]: 
array([[ 1, 1], 
     [ 7, 11], 
     [ 1, 20], 
     [20, 1], 
     [26, 11], 
     [31, 11]]) 

In [28]: out # Output 
Out[28]: 
array([[1, 0, 1], 
     [0, 1, 0], 
     [1, 0, 0], r = np.unique(B[:,0],return_inverse=1)[1] 
c = np.unique(B[:,1],return_inverse=1)[1] 
     [0, 1, 0], 
     [0, 1, 0]]) 
関連する問題