2013-04-03 64 views
2

我想將一個列表列表轉換爲一個數組,併發生了一些奇怪的事情。numpy.array無法正常工作?

例如,如果我聲明列表爲:

a=[] 
a.append(['a',1,10,100]) 
a.append(['b',2,20,200]) 
a.append(['c',3,30,300]) 
a.append(['d',4,40,400]) 

,然後通過

a=np.array(a) 

轉換成向量最終的結果是

[['a','1','1','1'],['b','2','2','2'],['c','3','3','3'],['d','4','4','4']] 

我是總的Python初學者,但從我讀到的使用np.array矢量中的所有內容都被轉換爲字符串(請糾正我如果我錯了)。爲什麼在這裏零被忽略,我能做些什麼來解決它?

回答

3

這是因爲數組的結果數據類型(即numpy必須猜測)是「長度爲1的字符串」。你需要指定一個最大項目大小:

In [51]: np.array(['a', 10]) 
Out[51]: 
array(['a', '1'], 
     dtype='|S1') 

In [56]: np.array(['a', 10], dtype=(str, 5)) 
Out[56]: 
array(['a', '10'], 
     dtype='|S5') 

In [57]: np.array(['a', 123456], dtype=(str, 5)) 
Out[57]: 
array(['a', '12345'], 
     dtype='|S5') 

In [58]: np.array(['a', 123456], dtype=(str, 6)) 
Out[58]: 
array(['a', '123456'], 
     dtype='|S6') 

Numpy data types

你確定你的二維數組不應該記錄在一維數組(見askewchan的答案)?

+0

其實這是開放的一些更改,但更好的只是在涉及非字符串時給出正確的字符串長度 – seberg

+0

我需要2d,但是這完全解決了問題。謝謝! – user1876307

+1

我希望你認識到[這些是你可以用字符串做的唯一的事情](http://docs.scipy.org/doc/numpy/reference/routines.char.html)。 –

3

使用np.array不會將所有內容都轉換爲字符串。 numpy.array說:

「dtype:data-type,optional 數組所需的數據類型如果沒有給出,那麼類型將被確定爲保持序列中對象所需的最小類型。只能用於'上傳'陣列。「

一般使用numpy你不應該混合類型。在你的例子中,你這樣做。我的猜測是,numpy試圖猜測你的參數的正確類型,這導致了類似字符串的上傳。但它確實出錯了。我沒有足夠的經驗來說出發生了什麼事。所以也許更聰明的人會解決這個問題。我建議numpy.dtype進一步閱讀。你可以用它做一些魔術。

我的建議是在創建numpy.array時堅持一種類型。特別是因爲它被設計來執行計算,而你試圖偷偷在一些字符串/字符。我不確定你想要做什麼計算。

編輯: 是的,我想我是一個numpy noob。結構化dtype似乎是混合類型數組的完美方式。

5

由於您的陣列(S)具有不均勻的數據類型,你必須指定一個「結構化」 dtype

In [2]: a = [('a', 1, 10, 100), 
    ...:  ('b', 2, 20, 200), 
    ...:  ('c', 3, 30, 300), 
    ...:  ('d', 4, 40, 400)] 

In [3]: a = np.array(a, dtype = "S1, int, int, int") 

In [4]: a 
Out[4]: 
array([('a', 1, 10, 100), 
     ('b', 2, 20, 200), 
     ('c', 3, 30, 300), 
     ('d', 4, 40, 400)], 
     dtype=[('f0', 'S1'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8')]) 

,您可以輕鬆地訪問爲:

In [5]: a.dtype.names = ['name','x','y','z'] 

In [6]: a['x'] 
Out[6]: array([1, 2, 3, 4]) 

In [7]: a['name'] 
Out[7]: 
array(['a', 'b', 'c', 'd'], 
     dtype='|S1') 

In [8]: a[0] 
Out[8]: ('a', 1, 10, 100)