2017-10-17 47 views
0

我目前正在嘗試實現一個數據類型,它將數組中的浮點數存儲在一個numpy數組中。然而,試圖用不同長度的這種類型的元素分配一個數組似乎明顯地破壞了代碼。人們會將一個序列分配給一個數組元素,這是不可能的。numpy數組類型如何與對象交互?

人們可以通過使用數據類型的對象,而不是浮子繞過此。這是爲什麼?如何在不創建序列的情況下使用浮動來解決此問題?

不起作用的示例代碼。

from numpy import * 

foo= dtype(float32, []) 
x = array([[2., 3.], [3.]], dtype=foo) 

示例代碼不工作:

from numpy import * 

foo= dtype(float32, []) 
x = array([[2., 3.], [3., 2.]], dtype=foo) 

示例代碼不工作,我試圖複製浮法:

from numpy import * 

foo= dtype(object, []) 
x = array([[2., 3.], [3.]], dtype=foo) 
+1

您能否澄清一下您試圖達到的目標?你想解決什麼問題? –

+0

我非常確定OP希望將數組的一個元素作爲一個浮點序列 - 可能是列表或元組 –

回答

0

object D型細胞在numpy的只是簡單地創建的陣列指向Python對象的指針。這意味着你失去了你通常從Numpy獲得的性能優勢,但是這樣做有時候還是有用的。

你的最後的示例創建長度爲2的一維陣列numpy的,所以這是兩個指針到Python對象。這兩個對象恰好是列表,Python列表具有任意的動態長度。

0

我不知道你想達到這一點,但要注意,

>>> np.dtype(np.float32, []) == np.float32 
True 

陣列需要相同數量的每個行元素。因此,如果您以numpy的形式提供列表列表,並且所有子列表都具有相同數量的元素,它會很樂意將其轉換爲數組。這就是你的第二個例子工作的原因。

如果子列表是不一樣的長度,則每個子列表被視爲一個單獨的對象和你結束了對象的一維數組。這就是你的第三個例子工作的原因。您的第一個示例不起作用,因爲您嘗試將一系列對象投射到浮動,這是不可能的。

總之,你不能,如果你的子列表的長度不同的創建float數組。充其量,您可以創建一維數組,因爲它們仍然被視爲對象。

>>> x = np.array(list(map(np.array, [[2., 3.], [3.]]))) 
>>> x 
array([array([ 2., 3.]), array([ 3.])], dtype=object) 
>>> x[0] 
array([ 2., 3.]) 
>>> x[0][1] 
3.0 
>>> # but you can't do this 
>>> x[0,1] 
Traceback (most recent call last): 
    File "<pyshell#18>", line 1, in <module> 
    x[0,1] 
IndexError: too many indices for array 

如果你在創建一個浮動二維數組彎曲,你必須所有的子表擴大到相同的大小與None,這將被轉換爲np.nan

>>> lists = [[2., 3.], [3.]] 
>>> max_len = max(map(len, lists)) 
>>> for i, sublist in enumerate(lists): 
    sublist = sublist + [None] * (max_len - len(sublist)) 
    lists[i] = sublist 

>>> np.array(lists, dtype=np.float32) 
array([[ 2., 3.], 
     [ 3., nan]], dtype=float32)