python中有2D字典吗?

时间:2016-09-12 19:42:15

标签: python numpy

我打算创建一个像:

这样的矩阵
    33  12  23  42  11  32  43  22
33  −   1   1   1   0   0   1   1
12  1   −   1   1   0   0   1   1
23  1   1   −   1   1   1   0   0
42  1   1   1   −   1   1   0   0
11  0   0   1   1   −   1   1   1
32  0   0   1   1   1   −   1   1
43  1   1   0   0   1   1   −   1
22  1   1   0   0   1   1   1   −

我想通过水平或垂直标题进行查询,因此我通过以下方式创建了矩阵:

a = np.matrix('99 33    12  23  42  11  32  43 22;33    99  1   1   1   0   0   1   1;12    1   99  1   1   0   0   1   1;23    1   1   99  1   1   1   0   0;42    1   1   1   99  1   1   0   0;11    0   0   1   1   99  1   1   1;32    0   0   1   1   1   99  1   1;43    1   1   0   0   1   1   99  1;22    1   1   0   0   1   1   1   99')

如果我查询[23] [11] = 1

,我想要获得某些数据

那么有没有办法可以创建一个二维字典,所以[23] [11] = 1?

由于

4 个答案:

答案 0 :(得分:3)

你明确要求numpy以外的东西。

defauldict default_factory dict,可以了解您想要的 2D词典

>>> from collections import defaultdict
>>> a = defaultdict(dict)
>>> a[23][11] = 1
>>> a[23]
{11: 1}
>>> a[23][11]
1

答案 1 :(得分:1)

您是否在寻找以字符串为键的词典?

d = {}
d[33, 12] = 1
d[33, 23] = 1
# etc

请注意,在python中d[a, b]只是d[(a, b)]

的语法糖

答案 2 :(得分:1)

另一种可能性是使用元组作为字典键

dict((33,12):1, (23,12):1, ...]

scipy.sparse具有稀疏矩阵格式,可将其值存储在此类字典中。使用您的值,这样的矩阵将表示50x50矩阵,其中大部分为0值,并且在这些选定坐标处仅为1。

请记住,字典的键(至少普通)不是有序的

这些数据会怎样?字典,无论是类型还是嵌套,都适用于某种用法,但对其他用户则有害。像你这样的矩阵对其他东西更好,比如沿着行或列的操作。字典格式很大程度上掩盖了那种有序的布局。

答案 3 :(得分:0)

如果我理解正确,您只想标记您的行/列。要保持在numpy数组框架内,一个简单的解决方案是在标签和数组顺序之间创建映射。我也将假设将标签转换为字符串是可以的,因为它们可以是任何东西(尽管整数也可以)。

l = {str(x) : ind for ind , x in enumerate((33,12,23,42,11,32,43,22))}
a = sp.linalg.circulant([99,1,1,1,0,0,1,1])
a[l['32'],l['23']]