2012-03-01 88 views
2

我想將一個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代替原來的數據[土地利用]

我認爲這會工作,但是我首先需要將土地利用轉換浮動到一個int

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

但是我試圖改變這種狀況浮筒由astype整數一直無果

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是同質的數據結構,數組中的意思是一切都必須具有相同的數據類型。考慮到這個限制,應該很清楚,你不能把一行整數換成一行字符串。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來將所有信息保存在一個數組中,如果這是你需要的。根據我的最終目標,我經常發現使用幾個單獨的數組或一組數組更容易。希望有所幫助。

+0

謝謝......這是一個有幫助和明確的解釋 – BJEBN 2012-03-02 09:40:19

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

感謝talomines多數民衆贊成什麼,我正在尋找一個numpy數組的字符串 – BJEBN 2012-03-01 15:08:13

+0

快速跟進...然後我如何修改我剛剛創建的名稱數組我的原始數組(數據),即替換原始數據[土地用途]與名字陣列?數據有幾種dtype(dtype [('X',' BJEBN 2012-03-01 16:02:07

+0

我敢肯定你想'a.get(i,'Urban')',而不是'a.setdefault',如果'i'修改'a'沒有在'a'中找到。 – 2012-03-01 16:39:19