2012-12-05 55 views
15

當數組包含字符串數據時,我遇到了numpy的一些看似微不足道的麻煩。我有以下代碼:奇怪的行爲初始化字符串數據的numpy數組

my_array = numpy.empty([1, 2], dtype = str) 
my_array[0, 0] = "Cat" 
my_array[0, 1] = "Apple" 

現在,當我print my_array[0, :]打印出來,我得到的迴應是['C', 'A'],這顯然不是貓和蘋果的預期輸出。爲什麼是這樣,我怎樣才能得到正確的輸出?

謝謝!

回答

28

Numpy要求字符串數組具有固定的最大長度。當您使用dtype=str創建一個空數組時,它默認將此最大長度設置爲1。你可以看看你是否my_array.dtype;它會顯示「| S1」,意思是「單字符串」。數組中的後續賦值被截斷以適應該結構。

你可以做你的最大長度傳遞一個明確的數據類型,例如:

my_array = numpy.empty([1, 2], dtype="S10") 

的「S10」,將創建長度爲10的字符串數組。你必須決定有多大才能保存你想要保存的所有數據。

+0

這是正確的,很高興知道!謝謝 – Jim

+0

一旦我更新列表中的一個元素(即'my_array [0] ='hello''),那麼第一個元素是否仍然具有分配的「10個字符值」的內存?還是現在真的是一個「S5」對象?我假設不是,因爲'numpy'數組的'dtype'必須在整個數組中保持一致? – Anonymous

+0

@jphollowed:對,整個數組的大小是固定的,所以如果將它初始化爲S10,即使存儲的實際字符串較小,每個條目仍會佔用10個字節。 – BrenBarn

2

我得到了一個「編解碼器錯誤」當我試圖使用非ASCII字符與dtype="S10"

您還可以得到一個數組,二進制字符串,這讓我感到困惑。

我認爲這是更好地使用:

my_array = numpy.empty([1, 2], dtype="<U10")

1

的numpy的串陣列通過其固定長度(長度爲1默認情況下)的限制。如果你不確定什麼長度你需要提前爲你的字符串,你可以使用dtype=object並獲得任意長度的字符串爲您的數據元素:

my_array = numpy.empty([1, 2], dtype=object) 

我的理解可能會有效率缺點這種方法,但我沒有很好的參考來支持這一點。

+0

是否有任何警告(如速度較慢),比如說「S10」? – Boern

0

另一種方法是初始化如下:

my_array = np.array([["CAT","APPLE"],['','']], dtype=str) 

換句話說,首先你寫你想要什麼樣的規則陣列,然後你把它變成一個numpy的陣列。但是,這會將最大字符串長度固定爲初始化時最長字符串的長度。因此,如果您要添加

my_array[1,0] = 'PINEAPPLE' 

那麼存儲的字符串將是'PINEA'。