Передача всех элементов в качестве аргумента эффективным способом - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть диктат, содержащий десять фреймов данных Pandas, и я хочу сложить их, используя Numpy. Один из способов сделать это - набрать:

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

Однако, по мере того, как количество элементов в словаре растет, это становится очень утомительным. Есть ли способ передать все элементы словаря одновременно, вместо того, чтобы вручную печатать каждый элемент, как указано выше?

Следующая попытка использования распаковки дает мне ошибку 'TypeError: стек () должны быть строковыми ключевыми словами:

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

Какой эффективный и питонный способ решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

**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]])
0 голосов
/ 09 апреля 2019

Причина, по которой вы получаете ошибку TypeError, заключается в том, что ваши ключи словаря не являются строками.

Вы можете попробовать передать свои значения в np.stack(), используя dict.values().

tensor = np.stack(dict.values(), axis = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...