Если я не ошибаюсь в том, чего вы хотите достичь, вы сначала должны прочитать ваш CSV-файл и создать отображение значений Class
в значения Density
. Это можно сделать следующим образом:
import csv
mapping = {}
with open('test.csv') as csv_file:
csv_reader = csv.DictReader(csv_file)
for row in csv_reader:
mapping[int(row['Class'])] = int(row['Density'])
Вы получите dict
, например:
{0: 6, 1: 9, 2: 4, 3: 9, 4: 7, 5: 2}
Затем вы можете использовать np.in1d
для созданияматрица маски того, что нужно заменить, и np.searchsorted
для замены элементов. Перед этим вам нужно сгладить растровый массив и восстановить его форму перед записью результата. (альтернативы для замены элементов в массиве NumPy можно найти в ответах на этот вопрос: Быстрая замена значений в массиве NUMPY )
# Save the shape of the raster array
s = rstr_arry.shape
# Flatten the raster array
rstr_arry = rstr_arry.reshape(-1)
# Create 2D replacement matrix:
replace = numpy.array([list(mapping.keys()), list(mapping.values())])
# Find elements that need replacement:
mask = numpy.in1d(rstr_arry, replace[0, :])
# Replace them:
rstr_arry[mask] = replace[1, numpy.searchsorted(replace[0, :], rstr_arry[mask])]
# Restore the shape of the raster array
rstr_arry = rstr_arry.reshape(s)
Затем вы можете записать свои данные почти , как вы планировали:
outBand.WriteArray(rstr_arry, 0, 0)
outBand.SetNoDataValue(-99)
outDs.SetGeoTransform(inRst.GetGeoTransform())
outDs.SetProjection(inRst.GetProjection())
outBand.FlushCache()
Тестирование на данных вашего примера:
rstr_arry = np.asarray([
[5, 2, 2, 3],
[0, 3, 1, 4],
[2, 0, 1, 3]])
mapping = {0: 6, 1: 9, 2: 4, 3: 9, 4: 7, 5: 2}
s = rstr_arry.shape
rstr_arry = rstr_arry.reshape(-1)
replace = numpy.array([list(mapping.keys()), list(mapping.values())])
mask = numpy.in1d(rstr_arry, replace[0, :])
rstr_arry[mask] = replace[1, numpy.searchsorted(replace[0, :], rstr_arry[mask])]
rstr_arry = rstr_arry.reshape(s)
print(rstr_arry)
# [[2 4 4 9]
# [6 9 9 7]
# [4 6 9 9]]