我打算创建一个像:
这样的矩阵 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?
由于
答案 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']]