2015-01-15 90 views
0

我試圖創建一個包含2個元組元組的numpy數組,其中第一個元素可以是任何東西,第二個元素是一個整數。閱讀numpy文檔我發現numpy.void類型是一種泛型類型。如果我定義我的新類型:瞭解numpy「void」dtype和通用數組

In [1]: import numpy as np 
In [2]: dt = np.dtype([('anything', 'V', 1), ('counter', 'i4', 1)]) 

我可以這樣做:

In [3]: np.array([("hi", 1), ("bye", 1)], dtype=dt) 
Out[3]: 
array([(<read-write buffer ptr 0x12f9bb0, size 1 at 0x7f03d020f870>, 1), 
    (<read-write buffer ptr 0x12f9bb5, size 1 at 0x7f03d020f830>, 1)], 
    dtype=[('anything', 'V1'), ('counter', '<i4')]) 

但我不能這樣做:

In [4]: np.array([(1, 1), (2, 1)], dtype=dt) 
------------------------------------------------------------ 
TypeError     Traceback (most recent call last) 
<ipython-input-4-637fcc25185b> in <module>() 
----> 1 np.array([(1, 1), (2, 1)], dtype=dt) 

TypeError: expected a readable buffer object 

有其使用numpy的dtypes通用的元組的方式嗎?

回答

1

Dtype O(object)可能比V更一般。然後,該數組將在指針處具有空間 - 可以指向任何類型的Python對象,無論是字符串,數字,列表,元組還是自定義類。

In [85]: dt=np.dtype([('anything', 'O'), ('counter','i4')]) 

In [86]: np.array([("hi",1), ("bye",1), ((1,1),2), (3,4)],dtype=dt) 
Out[86]: 
array([('hi', 1), ('bye', 1), ((1, 1), 2), (3, 4)], 
     dtype=[('anything', 'O'), ('counter', '<i4')]) 

我認爲在你的規範V1是一個字節沒有意義的,你的第一種情況描述爲<read-write buffer ptr 0x12f9bb0, size 1 at 0x7f03d020f870>


下面是其中一個足夠大的void可序列化緩衝區

In [119]: dt1=np.dtype([('anything', 'V',10), ('counter','i4')]) 
In [120]: A1=np.zeros(5,dt1) 

In [121]: A1['anything'][0]=b'anything' 
In [122]: A1['anything'][1]=b'' 


In [123]: A1['anything'][2]=pickle.dumps((1,2)) 
In [124]: pickle.loads(A1['anything'][2]) 
Out[124]: (1, 2) 

我定義一個字段作爲V10緩衝功能的方式。我可以爲此字段的各個元素分配任意長度的字節串,包括pickle.dumps的輸出。

In [128]: pickle.dumps((1,2)) 
Out[128]: b'\x80\x03K\x01K\x02\x86q\x00.' 

嘗試醃製(1,2,3)不工作 - 我可以轉讓,但由於整個緩衝區不適合負載失敗。

In [156]: A1 
Out[156]: 
array([([97, 110, 121, 116, 104, 105, 110, 103, 0, 0], 0), 
     ([48, 49, 50, 51, 52, 53, 54, 55, 56, 57], 0), 
     ([-128, 3, 75, 1, 75, 2, -122, 113, 0, 46], 0), 
     ([-128, 3, 71, 64, 40, -103, -103, -103, -103, -103], 0), 
     ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0)], 
     dtype=[('anything', 'V10'), ('counter', '<i4')]) 

所以我們必須仔細研究一下,弄清楚如何返回我最初定義的字節字符串。數字還必須以某種方式或其他方式進行序列化。我們總是可以回到pickle的一切。 JSON是另一個序列化選項。

+0

感謝您的回覆。使用numpy而不使用其他通用python結構的原因是因爲需要使用我需要使用的序列化庫。這個序列化過程強加了每個對象都必須映射到numpy.dtype類型的限制。 Dtype O(對象)是一個派生類型,並沒有被提取。我認爲這種情況可能是無法將任何東西映射到numpy.void類型。在接受你的答案之前,我會稍等一下,看看有沒有人提供解決方案。 – MonkeyButter

+0

我已經添加了一個多字節void的示例,並且使用'pickle'來序列化。 – hpaulj

相關問題