Преобразовать матрицу Numpy в список с индексами в виде кортежей - PullRequest
0 голосов
/ 31 октября 2019

У меня есть матрица (может быть простой матрицей, может быть скудной разреженной матрицей):

np.array([[0,2,3], [1,0,5], [3,3,4]])

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

Я хотел бы преобразовать это в словарь, где ключи являются кортежем индексов изначение представляет собой следующую запись в матрице для ненулевых элементов:

{(0,1): 2,
 (0,2): 3,
 (1,0): 1,
 (1,2): 5,
 (2,0): 3,
 (2,1): 3,
 (2,2): 4}

Каков наилучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 31 октября 2019

согласно документ :

import numpy as np

a = np.array([[0,2,3], [1,0,5], [3,3,4]])
print({index:x for index, x in np.ndenumerate(a) if x})

Вывод:

  {(0, 1): 2, (0, 2): 3, (1, 0): 1, (1, 2): 5, (2, 0): 3, (2, 1): 3, (2, 2): 4}
0 голосов
/ 31 октября 2019

Каждый ответ здесь повторяется по всей матрице, что неэффективно, если N x M >> #nnz, где N и M - размеры вашей матрицы, а #nnz - число ненулевых элементов. .

Мое решение:

import numpy as np
from scipy.sparse import csr_matrix

def get_nnz_dict(m):
    nnz_idx = m.nonzero()
    nnz_dict = {}
    for idx in range(len(nnz_idx[0])):
        row, col = nnz_idx[0][idx], nnz_idx[1][idx]
        nnz_dict[(row,col)] = m[row,col]
    return nnz_dict

M = np.array([[0,2,3], [1,0,5], [3,3,4]])
M_sp = csr_matrix(M)
nnz_dict = get_nnz_dict(M)
nnz_dict_sp = get_nnz_dict(M_sp)

Работает как для "нормального" массива, так и для скудных разреженных матриц.

0 голосов
/ 31 октября 2019

Вы можете сделать это с помощью цикла for:

x = np.array([[0,2,3], [1,0,5], [3,3,4]])

my_dict = {}
for i in range(len(x)):
    for j, elem in enumerate(x[i]):
        if(elem):
            my_dict[(i,j)] = elem

print(my_dict)
>>> {(0, 1): 2,
 (0, 2): 3,
 (1, 0): 1,
 (1, 2): 5,
 (2, 0): 3,
 (2, 1): 3,
 (2, 2): 4}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...