2017-09-12 73 views
1

背景:我試圖建立親和矩陣來饋入sklearn譜聚類。非整數索引的Python Numpy二維數組

在這個問題中,我遇到了numpy數組索引是基於0的整數的問題,對於我的應用程序,我使用某種特定於應用程序的ID(基於字符串,隨機示例「abc123」)。我想創建一個2d numpy數組,由我擁有的所有數據點索引。例如,給定兩個點points = ["abc123", "xyz456"],我會有2d numpy數組,其行索引和列索引爲points。所以我可以很容易地指定兩點之間的距離類似於arr["abc123"]["xyz456"] = dist

我怎麼能實現這一點?謝謝。

+0

爲什麼不使用字典? – Y0da

+0

因爲我需要將它提供給使用np 2d數組的IIle的sklearn。 – 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

謝謝。我可以將熊貓數據框添加到sklearn光譜聚類中嗎? – clwen

+1

@clwen,大部分'sklearn'方法都接受Pandas DataFrames。你總是可以從DataFrame中獲得一個Numpy數組:'df.values' - 將返回一個相應的Numpy數組 – MaxU

+0

Hi @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.])