2015-05-09 88 views
2

我想投我已经定义了一个numpy的矩阵:NumPy的混合型矩阵astype

matrix = numpy.array([['name','23','45','1'], 
         ['name2','223','43','5'], 
         ['name3','12','33','2']]) 

造成这样的:

array([['name1', '23', '45', '1'], 
     ['name2', '223', '43', '5'], 
     ['name3', '12', '33', '2']], 
     dtype='|S5') 

我想命名并投下的每一列我的矩阵的类型如下:

dt = numpy.dtype({'names':['name','x','y','n'],'formats': ['S10', 'S10', 'S10', 'S10']}) 

现在,我会考虑矩阵所有字符串,因为它不起作用,bu T为预期的这样'formats': ['S10', 'f3', 'f3', 'i'] ,并做一些这样的格式:

matrix.astype(dtype=dt,casting='safe') 

结果:

array([[('name', 'name', 'name', 'name'), ('23', '23', '23', '23'), 
     ('45', '45', '45', '45'), ('1', '1', '1', '1')], 
     [('name2', 'name2', 'name2', 'name2'), ('223', '223', '223', '223'), 
     ('43', '43', '43', '43'), ('5', '5', '5', '5')], 
     [('name3', 'name3', 'name3', 'name3'), ('12', '12', '12', '12'), 
     ('33', '33', '33', '33'), ('2', '2', '2', '2')]], 
     dtype=[('name', 'S10'), ('x', 'S10'), ('y', 'S10'), ('n', 'S10')]) 

我缺少什么?如何使用numpy模块为每个矩阵列定义类型?

回答

0

创建/填充结构化数组有点棘手。有多种方式,但我认为最简单的是要记住使用元组的列表:

In [11]: np.array([tuple(row) for row in matrix], dtype=dt) 
Out[11]: 
array([('name', '23', '45', '1'), 
     ('name2', '223', '43', '5'), 
     ('name3', '12', '33', '2')], 
     dtype=[('name', 'S10'), ('x', 'S10'), ('y', 'S10'), ('n', 'S10')]) 

结果是一维数组,与D型细胞领域取代了原来的二维数组的列。新阵列的每个元素都具有相同的类型 - 由dt指定。

或者,您可以创建所需的D型的空数组,并填写,通过现场按行或字段行:

In [14]: arr = np.zeros((3,),dt)  
In [16]: arr[0]=tuple(matrix[0,:]) # tuple of row 
In [17]: arr['name']=matrix[:,0] # field 

In [18]: arr 
Out[18]: 
array([('name', '23', '45', '1'), 
     ('name2', '', '', ''), 
     ('name3', '', '', '')], 
     dtype=[('name', 'S10'), ('x', 'S10'), ('y', 'S10'), ('n', 'S10')]) 

与兼容dt1view也将工作

dt1 = numpy.dtype({'names':['name','x','y','n'],'formats': ['S5', 'S5', 'S5', 'S5']}) 
matrix.view(dt1) 

这不会更改数据;它只是以不同的方式解释字节。


转换字符串号码是易与元组的列表

In [40]: dt2 = numpy.dtype({'names':['name','x','y','n'],'formats': ['S5', 'f', 'f', 'i']}) 

In [41]: np.array([tuple(row) for row in matrix], dtype=dt2)Out[41]: 
array([('name', 23.0, 45.0, 1), 
     ('name2', 223.0, 43.0, 5), 
     ('name3', 12.0, 33.0, 2)], 
     dtype=[('name', 'S5'), ('x', '<f4'), ('y', '<f4'), ('n', '<i4')]) 
+0

的这一个接近示出的矩阵。我的问题与2d数组有关,在我的情况下,它的形状应该是(3,4)而不是(3) – ePascoal

+0

但是'dtype'指定了4个字段,并且源中只有4列数据。你是否想将值复制到新的2d数组的每一列? – hpaulj

+0

请不要考虑我的dtype,主要问题是'如何使用numpy模块为每个矩阵列定义类型?' – ePascoal