Numpy整数到字符串

时间:2012-03-01 12:47:57

标签: numpy

我正在尝试将numpy数组从一个整数转换为字符串但是我的方法不起作用,我想我的问题也可能有更优雅的方法。

所以我有一个名为“landuse”的整数数组,它是一系列代表不同土地利用类别的数字1-3。这是我目前的方法......(这不是atm)

landuse2 = landuse.astype('S10')

for name in landuse2:
    if name == '1.0':
       name = 'Forest'
    elif name = '2.0'
       name = 'Water'
    else:
       name = 'Urban'

我尝试使用if语句只调用数字1,'1','1.0',1 *没有运气。它运行时没有错误,landuse2被转换为10个字符的字符串(虽然只有'1.0'...写在数组中),但for循环没有更新我的表。

修改

抱歉,我应该更具体地说明我的阵列是如何组织的。 Landuse是一个名为Data的更大数组的一部分,它有10列和10,000行。

我简单地将landuse2定义如下

 landuse2 = Data[Landuse]

然后我打算用landuse2替换原来的数据[Landuse]

我认为这会有效但是我首先需要将Landuse float转换为int

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

但是我试图通过astype将浮动更改为整数

Data[Landuse]= Data[Landuse].astype('int')

2 个答案:

答案 0 :(得分:1)

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

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')

答案 1 :(得分:1)

首先让我解释为什么你的循环不起作用,在python中赋值,即a = 1获取对象1并赋予它名称a。执行name = "Water"时,name会忘记之前指向的内容,现在指向"Water",但这并不意味着分配给name的上一个对象获得了替换为"Water"

这就是问题,现在是修复。如果将landuse作为整数代码数组,则可以使用查找表。该表应该足够大,以便在执行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')

我们创建了一个数组,其中包含每个人的姓名,年龄和身高,但请注意数组的形状是(2,)因为数组中有两个“人”。我不确定你的需求是什么,但你可以尝试使用灵活的dtype将所有信息保存在一个数组中,如果这就是你需要的。根据我的最终目标,我经常发现使用几个单独的数组或数组列表会更容易。希望有所帮助。