从键值对列表创建矩阵

2024-10-03 00:20:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpy数组的列表,其中包含一个名称-值对的列表,它们都是字符串。每个名称和值都可以在列表中多次找到,我想将其转换为二进制矩阵。在

列表示值,而行表示键/名称,当字段设置为1时,它表示特定的名称-值对。在

例如

我有

A : aa
A : bb
A : cc
B : bb
C : aa

我想把它转换成

^{pr2}$

我有一些代码可以做到这一点,但我想知道是否有一种更简单/开箱即用的方法来使用numpy或其他库。在

这是我目前为止的代码:

resources = Set(result[:,1])
resourcesDict = {}
i = 0 
for r in resources:   
    resourcesDict[r] = i
    i = i + 1

clients = Set(result[:,0])
clientsDict = {}
i = 0 
for c in clients:    
    clientsDict[c] = i
    i = i + 1

arr = np.zeros((len(clientsDict),len(resourcesDict)), dtype = 'bool')
for line in result[:,0:2]: 
    arr[clientsDict[line[0]],resourcesDict[line[1]]] = True

结果如下

array([["a","aa"],["a","bb"],..]

Tags: 代码innumpy名称列表forlineresult
3条回答
d = {'A': ['aa', 'bb', 'cc'], 'C': ['aa'], 'B': ['bb']}
rows = 'ABC'
cols = ('aa', 'bb', 'cc')
print '   ', ' '.join(cols)
for row in rows:
    print row, ' ',
    for col in cols:
            print ' 1' if col in d.get(row) else ' 0',
    print

>>>     aa bb cc
>>> A    1  1  1
>>> B    0  1  0
>>> C    1  0  0

这是np.unique的作业。不清楚数据的格式,但需要得到两个一维数组,一个有键,另一个有值,例如:

kvp = np.array([['A', 'aa'], ['A', 'bb'], ['A', 'cc'],
                ['B', 'bb'], ['C', 'aa']])

keys, values = kvp.T

rows, row_idx = np.unique(keys, return_inverse=True)
cols, col_idx = np.unique(values, return_inverse=True)

out = np.zeros((len(rows), len(cols)), dtype=np.int)
out[row_idx, col_idx] += 1

>>> out
array([[1, 1, 1],
       [0, 1, 0],
       [1, 0, 0]])
>>> rows
array(['A', 'B', 'C'], 
      dtype='|S2')
>>> cols
array(['aa', 'bb', 'cc'], 
      dtype='|S2')

如果没有重复的键值对,这个代码就可以正常工作。如果有重复,我建议滥用scipy的稀疏模块:

^{pr2}$

你可能有

m_dict = {'A': ['aa', 'bb', 'cc'], 'B': ['bb'], 'C': ['aa']}

我要这样做:

^{pr2}$

编辑

考虑到您的格式,它可能更符合以下行:

m_array = [['A', 'aa'], ['A', 'bb'], ['A', 'cc'], ['B', 'bb'], ['C', 'aa']]

res = defaultdict(lambda: defaultdict(int))
for k, v in m_array:
    res[k][v] = 1

这两者都给出了:

>>> res['A']['aa']
1
>>> res['B']['aa']
0

相关问题 更多 >