2010-04-14 69 views
0

我想轉換記錄陣列的列表 - D型是(UINT32,FLOAT32) - 進入D型細胞np.object的numpy的數組:存儲記錄陣列

X = np.array(instances, dtype = np.object) 

其中instances是數據類型爲np.dtype([('f0', '<u4'), ('f1', '<f4')])的陣列列表。 然而,上面的語句會導致數組,其元素也np.object類型:

X[0] 
array([(67111L, 1.0), (104242L, 1.0)], dtype=object) 

有誰知道爲什麼嗎?

下面的語句應該是相當於上面卻給人希望的結果:

X = np.empty((len(instances),), dtype = np.object) 
X[:] = instances 
X[0] 
array([(67111L, 1.0), (104242L, 1.0), dtype=[('f0', '<u4'), ('f1', '<f4')]) 

感謝&問候, 彼得

回答

1

斯特凡·範德沃爾特(一numpy的開發商)explains

ndarray構造函數盡其所能 來猜測你是什麼樣的數據 餵養它,但有時它需要一個 一點幫助....

我寧願構建陣列 明確,所以毫無疑問是什麼 是引擎蓋下發生:

當你這樣說

instance1=np.array([(67111L,1.0),(104242L,1.0)],dtype=np.dtype([('f0', '<u4'), ('f1', '<f4')])) 
instance2=np.array([(67112L,2.0),(104243L,2.0)],dtype=np.dtype([('f0', '<u4'), ('f1', '<f4')])) 
instances=[instance1,instance2] 
Y=np.array(instances, dtype = np.object) 

np.array被迫猜測是你想要的陣列的尺寸。 instances是兩個對象,每個長度爲2左右的列表,相當合理,np.array猜測稱,Y應該有形狀(2,2):

print(Y.shape) 
# (2, 2) 

在大多數情況下,我認爲這是將是期望。然而, 你的情況,因爲這不是你想要什麼,你必須明確地構建陣列:

X=np.empty((len(instances),), dtype = np.object) 
print(X.shape) 
# (2,) 

現在還沒有關於X的形狀問題:(2,),所以當你在數據飼料

X[:] = instances 

numpy足夠聰明,可以將instances視爲兩個對象的序列。