猿问

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

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

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

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

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

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

什么是解决此问题的有效且 Pythonic 的方法?


绝地无双
浏览 186回答 2
2回答

斯蒂芬大帝

**dict用于接受关键字参数的函数。它将字典解包为一组key=value参数。例如:像您这样使用整数作为键的字典:In [157]: dd = {0:np.arange(3),1:np.arange(10,13)}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;一个功能:In [158]: def foo(**kwargs):&nbsp;&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp;print(kwargs)&nbsp;&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;你的错误:In [159]: foo(**dd)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;---------------------------------------------------------------------------TypeError&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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)}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;In [161]: foo(**dd)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{'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}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;In [166]: alist = [np.arange(3), np.arange(10,13)]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;In [167]: np.stack(alist, **pdict)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Out[167]:&nbsp;array([[ 0,&nbsp; 1,&nbsp; 2],&nbsp; &nbsp; &nbsp; &nbsp;[10, 11, 12]])回到带有数字键的字典。我可以使用.values从字典中提取数组,并将其作为列表传递给stack:In [171]: dd = {0:np.arange(3),1:np.arange(10,13)}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;In [172]: list(dd.values())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Out[172]: [array([0, 1, 2]), array([10, 11, 12])]In [173]: np.stack(list(dd.values()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Out[173]:&nbsp;array([[ 0,&nbsp; 1,&nbsp; 2],&nbsp; &nbsp; &nbsp; &nbsp;[10, 11, 12]])

忽然笑

您收到 TypeError 的原因是您的字典键不是字符串。您可以尝试将您的值传递给np.stack()using&nbsp;dict.values()。tensor&nbsp;=&nbsp;np.stack(dict.values(),&nbsp;axis&nbsp;=&nbsp;0)
随时随地看视频慕课网APP

相关分类

Python
我要回答