具有非整数索引的Python Numpy 2d数组

具有非整数索引的Python Numpy 2d数组,python,numpy,scikit-learn,Python,Numpy,Scikit Learn,背景:我正在尝试构建亲和矩阵,以提供给sklearn光谱聚类 在这个问题中,我遇到了numpy数组索引是基于0的整数的问题,对于我的应用程序,我使用了某种特定于应用程序的ID(基于字符串,一个随机示例“abc123”)。我想创建一个2d numpy数组,该数组由我拥有的所有数据点索引。例如,给定两个点points=[“abc123”,“xyz456”],我将有一个2d numpy数组,其行索引和列索引都是点。因此,我可以通过类似于arr[“abc123”][“xyz456”]=dist的方式轻松

背景:我正在尝试构建亲和矩阵,以提供给sklearn光谱聚类

在这个问题中,我遇到了numpy数组索引是基于0的整数的问题,对于我的应用程序,我使用了某种特定于应用程序的ID(基于字符串,一个随机示例“abc123”)。我想创建一个2d numpy数组,该数组由我拥有的所有数据点索引。例如,给定两个点
points=[“abc123”,“xyz456”]
,我将有一个2d numpy数组,其行索引和列索引都是
。因此,我可以通过类似于
arr[“abc123”][“xyz456”]=dist的方式轻松指定两点之间的距离

我怎样才能做到这一点?谢谢。

可以做到这一点,还有更多

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]])

您可以使用带有键的字典,但如果仍然需要numpy数组,则可以使用
dtype
。从:


为什么不使用字典呢?因为我需要把它输入sklearn,它采用NP2D数组,IIUC。谢谢。我可以将pandas数据帧输入sklearn光谱聚类吗?@clwen,大多数
sklearn
方法都接受pandas数据帧。您可以从数据帧中获取Numpy数组:
df.values
-将返回相应的Numpy数组hi@MaxU谢谢您的回复。在您给出的示例中,列索引仍然是基于0的整数。我做了一点搜索,似乎熊猫多索引是一种方法。@clwen,这取决于你的需要。我可以举另一个例子,如果你能提供一个小的可复制的输入数据集和你想要的数据集…基本上我想的是行索引和列索引是相同的(数据点集)。我的问题简要提到这一点。但我确实看到你修改了答案,我认为这对我来说已经足够了。谢谢你的回答。
>>> 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.])