Преобразовать данные значения столбца в массив - numpy

У меня есть данные в длинном формате, в котором хранятся № строки, № столбца и значение, как показано ниже:

ROW  COLUMN   VALUE
  1       1       1
  1       3       3
  2       1       1
  2       2       2
  3       1       1
  3       2       2
  3       3       3

Обратите внимание, что определенные комбинации ROW, COLUMN отсутствуют (например, для ROW = 1 и COLUMN = 2 нет значения). Я хотел бы преобразовать это в массив 3 х 3, как это. Недостающая комбинация столбцов строк заполняется на 0:

   1    0   3
   1    2   0
   1    2   3

Мой первоначальный подход к решению этой проблемы состоял в том, чтобы объявить пустой массив 3 x 3, прочитать три столбца как массивы 1d, выполнить цикл по строкам и столбцам и обновить массив на основе массива значений. Для небольших размерных случаев это кажется выполнимым, но для более высоких размерностей это не кажется "питоническим" способом сделать это. Была ли эта проблема решена в какой-то постоянной функции в numpy пакет? Я смотрел в reshape - но это предполагает отсутствие пропущенных значений.

1 ответ

Решение

Когда у вас есть строка, столбец и значения в массивах numpy, вы можете сделать что-то вроде следующего. (Обратите внимание, что я выбрал более Pythonic подход, заключающийся в размещении индексов, основанных на 0, в row а также col).

Вот данные в одномерных массивах:

In [13]: row = np.array([0, 0, 1, 1, 2, 2, 2])

In [14]: col = np.array([0, 2, 0, 1, 0, 1, 2])

In [15]: values = np.array([11, 12, 13, 14, 15, 16, 17])

Создайте двумерный массив для хранения значений. Я использую максимумы из row а также col чтобы выяснить, насколько большим должен быть массив. Вы можете использовать некоторые другие значения, если row а также col не обязательно включать значения в последнюю строку или столбец.

In [16]: a = np.zeros((row.max()+1, col.max()+1), dtype=values.dtype)

Теперь заполните значения этим назначением

In [17]: a[row, col] = values

Et voilà:

In [18]: a
Out[18]: 
array([[11,  0, 12],
       [13, 14,  0],
       [15, 16, 17]])

Ваш пример - массив 3х3, но если у вас на самом деле будут намного большие массивы и не много записей, вы можете рассмотреть возможность использования скудной разреженной матрицы. Например, вот как вы можете создать матрицу "COO" из тех же данных, что и выше, используя coo_matrix класс:

In [25]: from scipy.sparse import coo_matrix

In [26]: c = coo_matrix((values, (row, col)), shape=(row.max()+1, col.max()+1))

In [27]: c
Out[27]: 
<3x3 sparse matrix of type '<type 'numpy.int64'>'
    with 7 stored elements in COOrdinate format>

In [28]: c.A
Out[28]: 
array([[11,  0, 12],
       [13, 14,  0],
       [15, 16, 17]])
Другие вопросы по тегам