Numpy数组到字典,索引作为值

3zwjbxry  于 2023-11-18  发布在  其他
关注(0)|答案(4)|浏览(95)

我有一个整数值的numpy数组,让我们把这个数组称为x。
我想创建一个列表,对于每个值,我都有x的索引来保存这个值。
例如:

x = [1,2,2,4,7,1,1,7,16]

字符串
我想得到:

{1: [0,5,6], 2:[1,2], 4:[3], 7:[4,7], 15:[16]}


我使用的括号是任意的,我不在乎我使用哪种数据结构,只要我能尽快将结果输出到文件中。最后我想要一个.txt文件,内容如下:
0,5,6
1,2
3
4,7
16

zpf6vheq

zpf6vheq1#

既然你提到你对你的值的数据结构不挑剔,t要得到像你在问题中发布的字典一样的东西,你可以对x中的唯一值进行字典理解,其中np.where是值:

>>> {i:np.where(x == i)[0] for i in set(x)}

{1: array([0, 5, 6]),
 2: array([1, 2]),
 4: array([3]),
 7: array([4, 7]),
 16: array([8])}

字符串
将其与通过列表的更普通的循环进行比较,对于较大的数组,这将显着更快:

def list_method(x):
    res = {i:[] for i in set(x)}
    for i, value in enumerate(x):
         res[value].append(i)
    return res

def np_method(x):
    return {i:np.where(x == i)[0] for i in set(x)}

x = np.random.randint(1, 50, 1000000)

In [5]: %timeit list_method(x)
259 ms ± 4.03 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [6]: %timeit np_method(x)
120 ms ± 4.15 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

bmp9r5qi

bmp9r5qi2#

python会是这样的:

result = {}
for idx,val in enumerate(x):
    arr = result.get(val,[])
    arr.append(idx)
    result[val] = arr

字符串

ycggw6v2

ycggw6v23#

x = [1,2,2,4,7,1,1,7,16]
numlist = []
numdict = {}
c = 0
for n in x:
    if n not in numlist:
        numlist.append(n)
        numdict[n] = [c]
    else:
        numdict[n].append(c)
    c += 1
print(numlist, numdict)

字符串
输出为:[1, 2, 4, 7, 16] {1: [0, 5, 6], 2: [1, 2], 4: [3], 7: [4, 7], 16: [8]}写入文件用途:

with open('file.txt', 'w') as f:
    f.write(str(numdict))

nfs0ujit

nfs0ujit4#

最快的方法是使用defaultdict(纯Python,O(n))

from collections import defaultdict

def list_to_unique_dict(data):
    unique_dict = defaultdict(list)
    for index, value in enumerate(data):
        unique_dict[value].append(index)
    return dict(unique_dict)

x = [1,2,2,4,7,1,1,7,16]
list_to_unique_dict(x)

Out[62]: {1: [0, 5, 6], 2: [1, 2], 4: [3], 7: [4, 7], 16: [8]}

x = np.random.randint(1, 50, 1000000)
%timeit list_to_unique_dict(x)
232 ms ± 13.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

字符串

相关问题