2012-03-01 36 views
2

numpy配列を整数から文字列に変換しようとしていますが、私の方法が機能していないので、私の問題に対してより洗練された方法があると思います。Numpy整数から文字列へ

私は土地利用のカテゴリを表す一連の数字である "landuse"と呼ばれるnumpy整数配列を持っています。これは、私が試した私の現在のアプローチ...(つまり働いていないATM)

landuse2 = landuse.astype('S10') 

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

ある文がコールする場合だけで数1、「1」、「1.0」、運のない1 *。エラーなしで実行され、landuse2は10文字の文字列に変換されます(ただし、 '1.0'のみが配列に書き込まれます)が、forループはテーブルを更新しません。

編集

申し訳ありませんが、私は私の配列の編成方法について、より具体的なされている必要があります。 Landuseは、10列と10,000行を持つDataという大きな配列の一部です。

landuse2 = Data[Landuse] 

を次のように私は単にしかし、私は最初の土地利用を変換する必要があり、私はこれが働くだろうと思い、私はその後、landuse2

で元のデータ[土地利用]を置き換えることを意図していたlanduse2を定義している

int型

astypeによって整数にそのフロートを変更する私の試みは無駄

されてきたが
Data[Landuse]=np.array([a.setdefault(i,'Urban') for i in Data[Landuse]],dtype='|S10') 

にフロート

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

答えて

1

まず、あなたのループがなぜ機能していないのかを、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は、アレイ内のすべてを意味し、均質なデータ構造であるので、表には十分な大きさでなければならない必要があります同じデータ型です。その制限を念頭に置いて、整数の行を取り、それを文字列の行と置き換えることはできません。

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

我々は(一人一人の名前、年齢と身長を保持する配列を作成したが、配列の形状があることがわかりました:numpyのは、あなたのような何かをできるようにする「柔軟dtypes」を持っています2)、配列内に2つの "人"があるためです。私はあなたのニーズが正確かどうかは確信していませんが、柔軟なdtypeを使用して、必要な場合にはすべての情報を1つの配列に保持することができます。私の最終目標に応じて、いくつかの別々の配列や配列のリストを使う方が簡単なことがよくあります。希望が役立ちます。

+0

ありがとう...それは有用で明確な説明でした – BJEBN

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] 

をあなたが目的の文字列のnumpyの配列の最終的な結果を持っているのであれば
['Forest', 'Water', 'Urban', 'Forest', 'Water', 'Urban'] 

、あなたはこれを行うことができます。

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

ありがとうございました。私は文字列の数が少ない配列を探していました。 – BJEBN

+0

クイックフォローアップ...私はちょうど作成した元のデータを置き換える名前配列で私の元々の配列(データ)土地利用]と名前の配列?データにはいくつかのdtypeがあります(dtype [( 'X'、 ' BJEBN

+0

'' i''を 'a'に変更する' a.setdefault'ではなく 'a.get(i、' Urban ')' 'a'には見つかりませんでした。 –