Numpy Integer to String на основе таблицы поиска - PullRequest
2 голосов
/ 01 марта 2012

У меня есть массив numpy, называемый landuse, который представляет собой последовательность чисел 1-3, представляющих различные категории землепользования. Я хочу преобразовать это в строку на основе таблицы поиска.

ids = [0,1,2,3]
lookup_table = ['None', 'Forest', 'Water', 'Urban']

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Сначала позвольте мне объяснить, почему ваш цикл не работает, в 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 для хранения всей информации в одном массиве, если это то, что вам нужно.В зависимости от конечной цели, я часто нахожу, что проще использовать несколько отдельных массивов или список массивов.Надеюсь, это поможет.

1 голос
/ 01 марта 2012

Я не совсем понимаю, в чем ваш вопрос, но, кажется, вы могли бы использовать словарь для этого:

import numpy as np
landuse=np.array([1,2,3,1,2,4],dtype=np.integer)
a={1:'Forest',2:'Water'}
print [a.setdefault(i,'Urban') for i in landuse]

, который выдаст список, содержащий интересующие вас строки:

['Forest', 'Water', 'Urban', 'Forest', 'Water', 'Urban']

Если вы хотите получить конечный результат в виде массива строк, вы можете сделать это:

name=np.array([a.setdefault(i,'Urban') for i in landuse],dtype='|S10')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...