Сначала позвольте мне объяснить, почему ваш цикл не работает, в python присваивание, то есть a = 1
берет объект 1
и дает ему имя a
.Когда вы делаете name = "Water"
, name
забывает то, на что оно указывало раньше, и теперь указывает на "Water"
, но это не означает, что предыдущий объект, который был назначен на name
, заменяется на "Water"
.
В этом проблема, и теперь для исправления.Если у вас есть использование земли в виде массива целочисленных кодов, вы можете просто использовать справочную таблицу.Таблица должна быть достаточно большой, чтобы вы не получили ошибку индексирования при выполнении lookup_table[landuse.max()]
import numpy as np
landuse = np.array([1,2,3,1,2,4])
lookup_table = np.array(['None', 'Forest', 'Water', 'Urban', 'Other'])
landuse_title = lookup_table[landuse]
И, наконец, заключительная часть вашего вопроса, numpy ndarray - это однородная структура данных, означающая всев массиве должен быть один и тот же тип данных.Имея это в виду, должно быть ясно, что вы не можете взять строку целых чисел и заменить ее строкой.У Numpy есть «гибкие dtypes», которые позволяют вам делать что-то вроде:
>>> dt = np.dtype([('name', 'S4'), ('age', 'int'), ('height', 'float')])
>>> array = np.array([('Mark', 25, 70.5),('Ben',40,72.75)], dtype=dt)
>>> array
array([('Mark', 25, 70.5), ('Ben', 40, 72.75)],
dtype=[('name', '|S4'), ('age', '<i4'), ('height', '<f8')])
>>> array.shape
(2,)
>>> array['name']
array(['Mark', 'Ben'],
dtype='|S4')
Мы создали массив, который содержит имя, возраст и рост для каждого человека, но обратите внимание, что форма массиваis (2,), потому что у нас есть два "человека" в массиве.Я не уверен, что именно вам нужно, но вы можете попробовать использовать гибкий тип dtype для хранения всей информации в одном массиве, если это то, что вам нужно.В зависимости от конечной цели, я часто нахожу, что проще использовать несколько отдельных массивов или список массивов.Надеюсь, это поможет.