2017-09-12 24 views
1

背景:sklearnスペクトルクラスタリングに対応するアフィニティマトリックスを構築しようとしています。非整数インデックスを持つPython Numpy 2d配列

この問題では、numpy配列インデックスが0から始まる整数で、アプリケーションで特定の種類のアプリケーション固有のID(文字列ベースのランダムな例 "abc123")を使用しているという問題が発生しました。私はすべてのデータポイントでインデックス化された2次元配列を作成したいと思います。たとえば、2つの点points = ["abc123", "xyz456"]が与えられていると、行インデックスと列インデックスがpointsである2dのnumpy配列が得られます。 2点間の距離を簡単に指定できるように、arr["abc123"]["xyz456"] = dist

私はそれをどのように達成することができますか?ありがとうございました。

+0

なぜ辞書を使用しないのですか? – Y0da

+0

私はそれをsklearnにフィードする必要があるので、これはnp 2d配列、IIUCを必要とします。 – clwen

答えて

3

Pandasははるかにこれを行うと、多くのことができます...

In [41]: import pandas as pd 

In [122]: a = np.random.randint(100, size=(5, 3)) 

In [123]: a 
Out[123]: 
array([[53, 7, 34], 
     [54, 56, 85], 
     [ 0, 11, 83], 
     [63, 28, 88], 
     [65, 19, 44]]) 

In [124]: df = pd.DataFrame(a, index=list('abcde'), columns=list('xyz')) 

In [125]: df 
Out[125]: 
    x y z 
a 53 7 34 
b 54 56 85 
c 0 11 83 
d 63 28 88 
e 65 19 44 

In [126]: df.loc[['a','d'], ['x','y']] 
Out[126]: 
    x y 
a 53 7 
d 63 28 

私たちは常に.valuesアクセサを使用してデータフレームからnumpyの配列を取得することができます。

In [127]: df.values 
Out[127]: 
array([[53, 7, 34], 
     [54, 56, 85], 
     [ 0, 11, 83], 
     [63, 28, 88], 
     [65, 19, 44]]) 

In [128]: df.loc[['a','d'], ['x','y']].values 
Out[128]: 
array([[53, 7], 
     [63, 28]]) 
+0

ありがとうございます。私はpandas DataFrameをsklearnスペクトルクラスタリングにフィードできますか? – clwen

+1

@clwenでは、ほとんどの 'sklearn'メソッドはPandas DataFramesを受け入れます。そして、あなたはいつもDataFrameからNumpy配列を得ることができます: 'df.values' - あなたに対応するNumpy配列を返します – MaxU

+0

こんにちは@MaxUあなたの返事に感謝します。指定した例では、列インデックスは0ベースの整数です。私は少しの検索をしました、それはパンダのマルチインデックスが行く方法です。 – clwen

1

あなたはキーで辞書を使用することができますが、まだnumpyの配列が必要な場合はdtypeで遊ぶことができます。 doc

>>> dt = np.dtype([('name', np.unicode_, 16), ('grades', np.float64, (2,))]) 
>>> x = np.array([('Sarah', (8.0, 7.0)), ('John', (6.0, 7.0))], dtype=dt) 
>>> x[1] 
('John', [6.0, 7.0]) 
>>> x[1]['grades'] 
array([ 6., 7.]) 
関連する問題