更改结构化数组的dtype会将字符串数据归零

时间:2013-09-26 00:06:19

标签: python numpy

我的问题基本上是this previous question的'Q2'中被问及(而非回答)的问题。

我有一个结构化数组,其中包含一列字符串和一列整数。我使用dict用整数替换字符串,但因为该列的类型未更改,所以整数记录为字符串。我可以将列的dtype更改为整数,但是然后所有字符串都将转换为0,而不是每个字符串中的整数值。如何更改列,以便在dtype转换期间不会丢失整数值?

我创建了一个说明性示例:

dat = np.array([('1', 3392),('2', 4159),('1', 1093),('1', 9836)], dtype=[('code', 'U24'),('id', 'i2')])
dat.astype(dtype=[('code', 'i4'), ('id', 'i2')])

但由于我无法理解的原因,这实际上有效,产生了:

array([(1, 3392), (2, 4159), (1, 1093), (1, 9836)], 
  dtype=[('code', '<i4'), ('id', '<i2')])

这就是我想要的!相反,出于某种原因,我得到相当于:

array([(0, 3392), (0, 4159), (0, 1093), (0, 9836)], 
  dtype=[('code', '<i4'), ('id', '<i2')])

什么可能导致所有'代码'值被清零,如果事实上,这不是ndarray.astype的预期结果?谢谢。 (如果它是相关的,我使用的是Python 3。)

编辑:以下是使用dict处理后的实际数据的快照。

array([('1', 2814), ('1', 1185), ('1', 6836), ('2', 7057), ('1', 5403),...

   ('1', 1642), ('1', 3967), ('2', 7982), ('1', 6139), ('1', 9934),
   ('2', 9932), ('1', 3044), ('1', 2769)], 
  dtype=[('name', '<U24'), ('id', '<i2')])

1 个答案:

答案 0 :(得分:0)

我猜你正在这样做:

baddata = numpy.array([('1', 2814), ('1', 1185), ('1', 6836), ('2', 7057), ('1', 5403),
   ('1', 1642), ('1', 3967), ('2', 7982), ('1', 6139), ('1', 9934),
   ('2', 9932), ('1', 3044), ('1', 2769)], 
  dtype=[('name', '<U24'), ('id', '<i2')])

baddata.astype([('code', 'i4')])
#>>> array([(0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,),
#>>>        (0,), (0,)], 
#>>>       dtype=[('code', '<i4')])

当你打算这样做的时候:

baddata = numpy.array([('1', 2814), ('1', 1185), ('1', 6836), ('2', 7057), ('1', 5403),
   ('1', 1642), ('1', 3967), ('2', 7982), ('1', 6139), ('1', 9934),
   ('2', 9932), ('1', 3044), ('1', 2769)], 
  dtype=[('name', '<U24'), ('id', '<i2')])

baddata.astype([('name', 'i4')])
#>>> array([(1,), (1,), (1,), (2,), (1,), (1,), (1,), (2,), (1,), (1,), (2,),
#>>>        (1,), (1,)], 
#>>>       dtype=[('name', '<i4')])

注意名称