2017-09-12 71 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.])