Python Numpy使用非整数索引的二维数组

3
背景:我正在尝试构建亲和力矩阵以输入到sklearn谱聚类中。
在这个问题中,我遇到了一个问题,即numpy数组索引是基于0的整数,而对于我的应用程序,我使用某种特定于应用程序的ID(基于字符串,例如“abc123”)。我想创建一个由我拥有的所有数据点索引的2d numpy数组。例如,给定两个点points = ["abc123", "xyz456"],我将有一个2d numpy数组,其行索引和列索引为points。这样,我就可以通过类似于arr["abc123"]["xyz456"] = dist的方式轻松指定两个点之间的距离。
我该如何实现?谢谢。

为什么不使用字典? - tupui
因为我需要将其输入到sklearn中,而sklearn需要np 2d数组,如果我理解正确的话。 - clwen
2个回答

4

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访问器从DataFrame中获取一个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]])

谢谢。我可以将Pandas数据帧馈送到Sklearn谱聚类中吗? - clwen
1
@clwen,大多数sklearn方法都接受Pandas DataFrames。而且您总是可以从DataFrame中获取Numpy数组:df.values - 这将给您返回一个相应的Numpy数组。 - MaxU - stand with Ukraine
嗨@MaxU,谢谢你的回复。在你给出的例子中,列索引仍然是以0为基准的整数。我做了一些搜索,似乎pandas的多级索引是正确的方法。 - clwen
@clwen,这取决于您的需求。如果您提供一个可重现的输入数据集和您想要的数据集,我可以提供另一个示例... - MaxU - stand with Ukraine
基本上我想表达的是行索引和列索引是相同的(一组数据点)。我的问题简要提到了这一点。但我看到你修改了答案,我认为那已经足够了解决我的问题。感谢你的回答。 - clwen

2

您可以使用带有键的字典,但如果仍需要numpy数组,则可以使用dtype进行操作。来自文档

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接