三列Numpy数组到元组的字典?

r3i60tvu  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(90)

因此,我试图找到执行以下转换的最快/最有效的方法。
从一个三列数组

import numpy as np
arr = np.array([[1,2,3,3],[5,6,7,8],[8,7,6,5]]).T

array([[1, 5, 8],
       [2, 6, 7],
       [3, 7, 6],
       [3, 8, 5]])

字符串
转换为一个dict,该dict以一个元组列表作为值从一列中删除,如下所示:

{1:[(5,8)], 2:[(6,7)],3: [(7,6),(8,5)]}

ergxz8rk

ergxz8rk1#

正如注解中所指出的,如果你正在构造一个dict,一个python对象,那么你只需要使用常规的Python方法。我建议在数组上使用.tolist(),因为这会转换为适当的Python数值类型(但它确实会生成一个中间列表)。因此,从那里开始,您只需使用您最喜欢的Python dict分组习惯用法:

result = {}
for key, *vals in arr.tolist():
    result.setdefault(key, []).append(tuple(vals))

字符串
如果你不想创建一个潜在的巨大的中间列表,那么你可以手动转换类型(这里我假设基于你的例子是int):

result = {}
for row in arr:
    key, *vals = map(int, row)
    result.setdefault(key, []).append(tuple(vals))

2q5ifsrm

2q5ifsrm2#

In [257]: from collections import defaultdict
In [258]: arr = np.array([[1,2,3,3],[5,6,7,8],[8,7,6,5]]).T
In [259]: arr
Out[259]: 
array([[1, 5, 8],
       [2, 6, 7],
       [3, 7, 6],
       [3, 8, 5]])

字符串
defaultdict使收集“相关”值变得容易。只需定义一个使列表值作为默认值的函数。

In [260]: dd = defaultdict(list)


然后添加元素,使用第一个元素作为键,其余的作为元组(附加到default [])。

In [261]: for i in arr.tolist():
     ...:     dd[i[0]].append(tuple(i[1:]))
     ...: 
In [262]: dd
Out[262]: defaultdict(list, {1: [(5, 8)], 2: [(6, 7)], 3: [(7, 6), (8, 5)]})


对于迭代,列表比数组快一点。

tag5nh1u

tag5nh1u3#

import numpy as np
from collections import defaultdict

arr = np.array([[1,2,3,3],[5,6,7,8],[8,7,6,5]]).T
# every value of the key in your dict is a list
d = defaultdict(list)

for a in arr:
    d[a[0]].append((a[1], a[2]))

print(d)

字符串

相关问题