Создать numpy матрицу из содержимого в словаре, помеченного i, j - PullRequest
0 голосов
/ 19 февраля 2020

Предположим, у меня есть словарь:

d = {(0,0): 1, (0,1): 2, (1,0): 3, (1,1): 4}

Я хочу сделать это в массив (т. Е. Ключи соответствуют индексам массива)

array([[1, 2],
       [3, 4]])

Есть ли лучший способ сделать это, чем для петель? (Я пытался np.fromfunction, но это не сработало.)

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

items дает список ключей и значений, которые вы можете легко использовать для назначения значений предварительно выделенному массиву.

In [624]: d = {(0,0): 1, (0,1): 2, (1,0): 3, (1,1): 4}                                         
In [625]: list(d.items())                                                                      
Out[625]: [((0, 0), 1), ((0, 1), 2), ((1, 0), 3), ((1, 1), 4)]
In [626]: res = np.zeros((2,2),int)                                                            
In [627]: for id,val in d.items(): 
     ...:     res[id]=val 
     ...:                                                                                      
In [628]: res                                                                                  
Out[628]: 
array([[1, 2],
       [3, 4]])

В качестве альтернативы присвойте элементы спискам keys и values :

In [640]: k,v = list(d.keys()), list(d.values())                                               
In [641]: res[tuple(np.transpose(k))]=v                                                        
In [642]: res                                                                                  
Out[642]: 
array([[1, 2],
       [3, 4]])

In [643]: np.transpose(k)                                                                      
Out[643]: 
array([[0, 0, 1, 1],
       [0, 1, 0, 1]])
1 голос
/ 19 февраля 2020

Кажется, у вас есть словарь ключевых ситуаций, который может быть обработан с помощью scipy s dok_matrix:

from scipy.sparse import dok_matrix

d = {(0,0): 1, (0,1): 2, (1,0): 3, (1,1): 4}

mat = dok_matrix((2,2))
mat._update(d)
mat = mat.todense()

, который дает вам:

>>> mat
matrix([[1., 2.],
        [3., 4.]])
0 голосов
/ 28 февраля 2020

Возвращаюсь, чтобы ответить на мой собственный вопрос. Часть головоломки, которую я пропустил, была np.vectorize (). Проверьте это:

d = {(0,0): 1, (0,1): 2, (1,0): 3, (1,1): 4}
f = lambda i,j: d[(i,j)]
g = np.vectorize(f)
arr = np.fromfunction(f, (2,2))

Это дает мне именно то, что я хотел:

array([[1, 2],
       [3, 4]])

Это было так просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...