Предполагая, что столбцы вашего df
равны 'x', 'y', 'value', вы можете использовать расширенное индексирование
>>> x, y, value = data['x'].values, data['y'].values, data['value'].values
>>> result = np.zeros((y.max()+1, x.max()+1), value.dtype)
>>> result[y, x] = value
Это, однако, не будет работать должным образом, если координаты неуникальный.В этом случае безопаснее (но медленнее) использовать add.at
:
>>> result = np.zeros((y.max()+1, x.max()+1), value.dtype)
>>> np.add.at(result, (y, x), value)
В качестве альтернативы, вы можете создать разреженную матрицу, поскольку ваши данные оказываются в разреженном формате coo.Используя свойство '.A', вы можете затем преобразовать его в обычный (плотный) массив по мере необходимости:
>>> from scipy import sparse
>>> spM = sparse.coo_matrix((value, (y, x)), (y.max()+1, x.max()+1))
>>> (spM.A == result).all()
True
Обновление : если значение заполнения не равно нулю, вышеприведенное необходимо изменить.
Метод 1: заменить вторую строку на (помните, что это следует использовать только в том случае, если координаты уникальны):
>>> result = np.full((y.max()+1, x.max()+1), fillvalue, value.dtype)
Метод 2: не работает
Метод 3: после создания spM
do
>>> spM.sum_duplicates()
>>> assert spM.has_canonical_format
>>> spM.data -= fillvalue
>>> result2 = spM.A + fillvalue