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

Mar*_*Omo 11 numpy python-2.7

我创建了一个数组:

Ticket_data = np.empty((0,7),
                       dtype='str,datetime64[m],datetime64[m],str,str,str,str')
Run Code Online (Sandbox Code Playgroud)

我正在尝试附加数据:

lineitem = [str(data[0][0]), OpenDT, CloseDT, str(data[0][11]),
            str(data[0][12]), str(data[0][13]), str(data[0][14])]
Run Code Online (Sandbox Code Playgroud)

OpenDTCloseDT与创建np.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
Run Code Online (Sandbox Code Playgroud)

编辑:

print np.array([lineitem])
Run Code Online (Sandbox Code Playgroud)

产出

[['21539' '2015-06-30T10:46-0700' '2015-06-30T10:55-0700' 'Testtext'
 'Testtext2' 'Testtext3' 'Testtext5']]
Run Code Online (Sandbox Code Playgroud)

print np.array([lineitem], dtype=Ticket_data.dtype)
Run Code Online (Sandbox Code Playgroud)

输出

[[('', 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, '', '', '', '')]]
Run Code Online (Sandbox Code Playgroud)

我能做些什么来解决这个问题?

ali*_*i_m 13

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

Ticket_data = np.empty((0,),
                       dtype='str,datetime64[m],datetime64[m],str,str,str,str')
Run Code Online (Sandbox Code Playgroud)

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

例如:

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')
Run Code Online (Sandbox Code Playgroud)

在这个例子中,每个元素都被转换为一个 21 长的字符串。在dtype这个阵列的不匹配的Ticket_data,而且因为没有投没有安全的方式'|S21''np.datetime64[m]'你一个invalid type promotion错误。

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

np.array([tuple(lineitem)], dtype=Ticket_data.dtype)
Run Code Online (Sandbox Code Playgroud)

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

np.array([tuple(lineitem)], dtype=Ticket_data.dtype).shape
# (1,)
Run Code Online (Sandbox Code Playgroud)

如果我lineitem给一个元组,然后我得到一个(1, 7)数组,其中每个单独的元素lineitem被解释为顺序'str,datetime64[m],datetime64[m],str,str,str,str',导致你在编辑显示无稽之谈。

然后可以将结果连接到Ticket_label


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