Изменить форму матрицы - PullRequest
       6

Изменить форму матрицы

0 голосов
/ 14 февраля 2019

В моем коде есть следующая матрица:

M=[[1, 1,  0],
  [2, 1,  0],
  [3, 1,  0],
  [4, 1,  3],
  [5, 1,  0],
  [6, 1,  4],
  [7, 1,  4],
  [8, 1,  5],
  [1, 2,  0],
  [2, 2,  2],
  [3, 2,  7],
  [4, 2,  3],
  [5, 2,  0],
  [6, 2,  3],
  [7, 2,  0],
  [8, 2,  5],
  [1, 3,  1],
  [2, 3,  1],
  [3, 3,  0],
  [4, 3,  3],
  [5, 3,  6],
  [6, 3,  5],
  [7, 3,  4],
  [8, 3,  0]]

И я хотел бы преобразовать ее в следующую

new_M=[[0, 0, 0, 3, 0, 4, 4, 5],
      [0, 2, 7, 3, 0, 3, 0, 5],
      [1, 1, 0, 3, 6, 5, 4, 0]]

Я пробовал использовать следующий код:

new_M=[]
l=0
for j in range(3):
    for k in range(8):
        new_M[j][k]=M[l][2]
        l=l+1

Но я получаю следующую ошибку: IndexError: список индексов выходит за пределы диапазона

Я был бы признателен за способ исправить этот Код или лучший Код для выполнения той же Задачи.PD: Я также был бы признателен за подробное объяснение Кодекса, потому что я в новинку в использовании Python.

Большое спасибо в Advance.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Один вариант, если вы хотите использовать два первых столбца для построения ndarray, это использовать scipy.sparse.csr_matrix.

В этом случае вы можете построить матрицу разреженных строк с помощьюуказав:

csr_matrix ((data, (row_ind, col_ind)), [shape = (M, N)]):

, где data, row_ind и col_ind удовлетворяют соотношению a[row_ind [k], col_ind [k]] = data [k].


from scipy.sparse import csr_matrix
x = np.array(M)

sp = csr_matrix((x[:,-1], (x[:,1]-1, x[:,0]-1)))
sp.todense()

matrix([[0, 0, 0, 3, 0, 4, 4, 5],
        [0, 2, 7, 3, 0, 3, 0, 5],
        [1, 1, 0, 3, 6, 5, 4, 0]], dtype=int64)

Примечание. Индексы строк и столбцов должны начинаться с 0, то естьпочему я вычитаю 1

0 голосов
/ 14 февраля 2019

numpy может выполнить много замечательных заданий:

import numpy as np

np.array(M)[:, 2].reshape(3,8)
array([[0, 0, 0, 3, 0, 4, 4, 5],
      [0, 2, 7, 3, 0, 3, 0, 5],
      [1, 1, 0, 3, 6, 5, 4, 0]])

В случае, если первые два столбца на самом деле являются 2d-индексами:

my_arr = np.array(M)
new_arr = np.zeros((3,8))
np.add.at(new_arr, (my_arr[:,1]-1, my_arr[:,0]-1), my_arr[:,2])
print(new_arr)
[[0. 0. 0. 3. 0. 4. 4. 5.]
 [0. 2. 7. 3. 0. 3. 0. 5.]
 [1. 1. 0. 3. 6. 5. 4. 0.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...