матричное умножение вложенного словарного хранилища и 1d массива - PullRequest
0 голосов
/ 01 сентября 2018

поэтому я хочу сделать базовое матричное умножение A на x, поэтому Ax = b но A - это «словарь», содержащий разреженную матрицу (даются только записи, отличные от нуля), а x - это 1d-массив. так например

A = {0: {2: 2, 3: 3}, 1: {3: 5}, 3: {1: 10}}

визуально это выглядит как

, а x - это 1d-массив, так что

x = np.array([1, 1, 1, 1]) #x1 x2 x3 x4
x
for i in x:
    print(i)

В конце я хочу, чтобы результат Ax также был 1d numpy массивом (A равен 4 на 4, а x равен 4 на 1, поэтому A * x также должен быть 4 на 1). поэтому вывод должен быть

Ax = np.array([5, 5, 0, 10])

есть ли способ сделать матричное умножение A в правильном порядке, учитывая только разреженную матрицу?

1 Ответ

0 голосов
/ 01 сентября 2018

Первое решение использует разреженные матрицы в формате координат от scipy (см. coo_matrix ):

from scipy.sparse import coo_matrix

rows, cols, data = zip(*[(row, col, A[row][col]) for row in A for col in A[row]])
coo = coo_matrix((data, (rows, cols)))

>>> coo.toarray()
array([[ 0,  0,  2,  3],
       [ 0,  0,  0,  5],
       [ 0,  0,  0,  0],
       [ 0, 10,  0,  0]])

coo.dot(x)
>>> array([ 5,  5,  0, 10])

Второе решение использует python и numpy только для NaN и для хранения окончательного массива:

rows = range(min(A.keys()), 1 + max(A.keys()))

result = []
for row in rows:
    row_data = A.get(row)
    result.append(sum(A_val * x[col]
                      for col, A_val in row_data.iteritems())  # .items() for Python 3
                  if row_data else np.nan)
Ax = np.array(result)

>>> Ax
array([  5.,   5.,  nan,  10.])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...