Преобразовать данные значения столбца в массив - 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]])