基于查找表将整数Numpy转换为字符串

基于查找表将整数Numpy转换为字符串,numpy,Numpy,我有一个名为“土地利用”的numpy数组,它是一系列数字1-3,代表不同的土地利用类别。我想根据查找表将其转换为字符串 ids = [0,1,2,3] lookup_table = ['None', 'Forest', 'Water', 'Urban'] 我不完全清楚你的问题是什么,但似乎你可以用字典来解释: import numpy as np landuse=np.array([1,2,3,1,2,4],dtype=np.integer) a={1:'Forest',2:'Water'}

我有一个名为“土地利用”的numpy数组,它是一系列数字1-3,代表不同的土地利用类别。我想根据查找表将其转换为字符串

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

我不完全清楚你的问题是什么,但似乎你可以用字典来解释:

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']
如果您的目标是在字符串的numpy数组中获得最终结果,则可以执行以下操作:

name=np.array([a.setdefault(i,'Urban') for i in landuse],dtype='|S10')

首先,让我解释一下为什么循环不起作用,在python中,赋值(即
a=1
获取对象
1
并将其命名为
a
)。当您执行
name=“Water”
操作时,
name
会忘记它以前指向的对象,而现在指向的是
“Water”
,但这并不意味着以前分配给
name
的对象会被替换为
“Water”

这就是问题所在,现在需要解决。如果将土地使用作为整数代码数组,则只需使用查找表即可。表格应该足够大,以便在执行
查找表格[landuse.max()]时不会出现索引错误。

对于问题的最后一部分,numpy ndarray是一个同质数据结构,这意味着数组中的所有内容都必须具有相同的数据类型。考虑到这一限制,应该清楚的是,您不能将一行整数替换为一行字符串。Numpy确实有“灵活的数据类型”,允许您执行以下操作:

>>> 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')
dt=np.dtype([('name','S4'),('age','int'),('height','float')) >>>数组=np.数组([('Mark',25,70.5),('Ben',40,72.75)],dtype=dt) >>>排列 数组([('Mark',2570.5),('Ben',4072.75)],
dtype=[('name','S4'),('age','我很确定您想要
a.get(I,'Urban'))
,而不是
a.setdefault
,如果
a
中找不到
i
,它会修改
a
。@Bago:我把它作为一个功能,而不是一个bug,因为我不清楚它的确切意图。我认为拥有一个包含输入中所有键及其映射的字典可能有用。我明白了,我想我会把它点出来,以防OP或其他读者不知道区别。
>>> 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')