2010-04-14 117 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视为两个对象的序列。