从字典的特定键创建多维numpy数组

2024-05-14 07:53:21 发布

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

我有这样的字典:

a = dict(zip( ['k1', 'k2', 'k3', 'k4'], 
          ... [ [1,2,3,4], [10,20,30,40], [100,200,300,400], [1000,2000,3000,4000]])

>>> a
{'k1': [1, 2, 3, 4], 'k2': [10, 20, 30, 40], 'k3': [100, 200, 300, 400], 'k4': [1000, 2000, 3000, 4000]}

我想做的是:获取多个键的值并从中创建多维numpy数组。像这样:

result = numpy.array( [a[x] for x in ('k1' , 'k3')]

我试过这个代码:

ar = numpy.array([])
for el in ['k1', 'k3']:
     ar = numpy.r_[ar, num_dict[el]]
ar = ar.reshape(2,len(ar)/2)

但是否有一些内置的功能或更优雅的方式?你知道吗


Tags: innumpyfor字典k2k1数组result
2条回答

我只需要一个numpy数组,所以我找不到没有循环的方法。 我创建函数:

def loadFromDict( fieldnames, dictionary ):
    ''' fieldnames - list of needed keys, dictionary - dict for extraction
     result - numpy.array size of (number of keys, lengths of columns in dict)'''
    ar = numpy.zeros( (len(fieldnames), len(dictionary[fieldnames[0]])) )
    for c,v in enumerate(fieldnames,0):
        ar[c,:] = dictionary[v]
    return ar

在我的例子中,字典对所有列都有相同的长度。不管怎样,实现它们很容易:使用[len(v) for v in dictionary.values()]获取所有长度,或者查找当前键的长度。你知道吗

列表列表是np.array的正常输入,因此您的列表理解是有意义的。你知道吗

In [382]: [a[x] for x in ['k1','k3']]
Out[382]: [[1, 2, 3, 4], [100, 200, 300, 400]]

还是整本字典

In [385]: np.array(list(a.values()))    # list required in py3
Out[385]: 
array([[1000, 2000, 3000, 4000],
       [   1,    2,    3,    4],
       [  10,   20,   30,   40],
       [ 100,  200,  300,  400]])

通常字典里的词条都是在理解时一个接一个地选择的。operator有一个方便的类,可以通过一个调用获取多个键(我不认为它在速度上有多大区别):

In [386]: import operator
In [387]: operator.itemgetter('k1','k3')(a)
Out[387]: ([1, 2, 3, 4], [100, 200, 300, 400])

我认为用r_迭代不是一个好的选择。r_只是concatenate的掩护。如果必须迭代,则重复的concatante会比较慢。最好建立一个列表,并在末尾创建数组(如列表理解中所示)。你知道吗

相关问题 更多 >

    热门问题