以有效的方式将dict中的所有项目作为参数传递

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以有效的方式将dict中的所有项目作为参数传递相关的知识,希望对你有一定的参考价值。

我有一个包含十个Pandas数据帧的dict,我想用Numpy堆叠它们。我可以这样做的一种方法是输入:

tensor = numpy.stack((dict[0],dict[1],...,dict[9]),axis=0)

但是,随着字典中项目数量的增加,这变得非常烦人。有没有办法一次传递所有字典项目,而不是像上面手动输入每个元素?

以下使用解包的尝试给我一个'TypeError:stack()关键字必须是字符串'错误:

tensor = numpy.stack(**dict,axis=0)

什么是解决这个问题的有效和pythonic方法?

答案

**dict用于接受关键字参数的函数。它将字典解压缩为一组key=value参数。例如:

像你这样使用整数作为键的字典:

In [157]: dd = {0:np.arange(3),1:np.arange(10,13)}                              

功能:

In [158]: def foo(**kwargs): 
     ...:     print(kwargs) 
     ...:                                                                       

你的错误:

In [159]: foo(**dd)                                                             
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-159-965b46c2342b> in <module>
----> 1 foo(**dd)

TypeError: foo() keywords must be strings

它不想这样做:foo(0=..., 1=...)

如果我使用有效变量名称的字符串参数定义字典:

In [160]: dd = {'key0':np.arange(3),'key1':np.arange(10,13)}                    
In [161]: foo(**dd)                                                             
{'key0': array([0, 1, 2]), 'key1': array([10, 11, 12])}

这就解释了即时错误。

但这仍然不适用于具有签名的stack

np.stack(arrays, axis=0, out=None)

我可以使用字典来提供关键字参数,但不能使用arrays参数:

In [165]: pdict = {'axis':0, 'out':None}                                        
In [166]: alist = [np.arange(3), np.arange(10,13)]                              
In [167]: np.stack(alist, **pdict)                                              
Out[167]: 
array([[ 0,  1,  2],
       [10, 11, 12]])

用数字键回到字典。我可以使用.values从字典中提取数组,并将其作为列表传递给stack

In [171]: dd = {0:np.arange(3),1:np.arange(10,13)}                              
In [172]: list(dd.values())                                                     
Out[172]: [array([0, 1, 2]), array([10, 11, 12])]
In [173]: np.stack(list(dd.values()))                                           
Out[173]: 
array([[ 0,  1,  2],
       [10, 11, 12]])
另一答案

您获得TypeError的原因是您的字典键不是字符串。

您可以尝试使用np.stack()将值传递到dict.values()

tensor = np.stack(dict.values(), axis = 0)

以上是关于以有效的方式将dict中的所有项目作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何使用react将多个参数作为url中的对象传递

如何有效地将用户添加到 GitLab 中的所有项目(以编程方式或其他方式)

bash:以空格作为参数传递路径?

如何将 JSON 数组作为 URL 中的参数传递

将 dict 传递给 scikit learn estimator

将 ATTRidVendor 作为 udev 脚本中的参数传递