附加到异构numpy数组时出现“TypeError:无效类型提升”

时间:2015-07-01 22:53:11

标签: python-2.7 numpy

我用:

创建了一个数组
Ticket_data = np.empty((0,7),
                       dtype='str,datetime64[m],datetime64[m],str,str,str,str')

我试图用以下内容追加数据:

lineitem = [str(data[0][0]), OpenDT, CloseDT, str(data[0][11]),
            str(data[0][12]), str(data[0][13]), str(data[0][14])]

使用OpenDT

创建CloseDTnp.datetime64(DTstring, 'm')的位置

我收到错误:

Traceback (most recent call last):
  File "Daily Report.py", line 25, in <module>
    np.append(Ticket_data, np.array([lineitem]), axis=0)
  File "C:\Python27\lib\site-packages\numpy\lib\function_base.py", line 3884, in append
    return concatenate((arr, values), axis=axis)
TypeError: invalid type promotion

编辑:

print np.array([lineitem])

输出

[['21539' '2015-06-30T10:46-0700' '2015-06-30T10:55-0700' 'Testtext'
 'Testtext2' 'Testtext3' 'Testtext5']]

print np.array([lineitem], dtype=Ticket_data.dtype)

输出

[[('', 245672259890L, datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
  ('', datetime.datetime(2015, 6, 30, 17, 46), datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
  ('', datetime.datetime(2015, 6, 30, 17, 55), datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
  ('', 7741528753124368710L, datetime.datetime(1982, 11, 21, 6, 33), '', '', '', '')
  ('', 7959953343691844691L, datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
  ('', datetime.datetime(5205, 7, 21, 7, 42), datetime.datetime(1970, 1, 1, 0, 0), '', '', '', '')
  ('', 2336635297857499728L, 2338042681633169744L, '', '', '', '')]]

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:4)

首先,结构化数组中的 fields 与常规ndarray中的维度不同。您希望Ticket_label数组 1维,但该维度中的每个行元素都包含 7个字段,例如:

Ticket_data = np.empty((0,),
                       dtype='str,datetime64[m],datetime64[m],str,str,str,str')

现在,为了将lineitem连接到Ticket_data,首先必须将它从嵌套列表隐式转换为数组。由于您没有为每个字段指定单独的dtype,因此numpy会将lineitem视为同构数组,并找到可以安全地提升每个元素的公共dtype。< / p>

例如:

lineitem = ['foo', np.datetime64('1979-03-22T19:00', 'm'),
            np.datetime64('1979-03-22T19:00', 'm'), 'bar', 'baz', 'a', 'b']

np.array(lineitem)
# array(['21539', '2015-06-30T10:46-0700', '2015-06-30T10:55-0700',
#        'Testtext', 'Testtext2', 'Testtext3', 'Testtext5'], 
#       dtype='|S21')

在此示例中,每个元素都转换为21个长的字符串。此数组的dtypeTicket_data的数组不匹配,由于没有安全的方式将'|S21'转换为'np.datetime64[m]',因此会出现invalid type promotion错误。

您可以通过将lineitem显式地转换为数组来避免错误,为每个字段指定正确的dtypes:

np.array([tuple(lineitem)], dtype=Ticket_data.dtype)

请注意,我将lineitem投射到元组 - 这是必要的,以便将lineitem中的元素解释为单独的字段而不是单独的元素。结果是一个形状(1,)(不是(1, 7)):

的数组
np.array([tuple(lineitem)], dtype=Ticket_data.dtype).shape
# (1,)

如果我没有lineitem投射到元组,那么我会得到一个(1, 7)数组,其中{em>个人元素位于{ {1}}被解释为lineitem序列,导致您在编辑中显示的废话。

然后可以将结果连接到'str,datetime64[m],datetime64[m],str,str,str,str'

顺便说一句,我强烈建议使用pandas而不是结构化数组来处理异构数据,例如此。