In [266]: t = np.arange('2010-09-01','2010-09-02', dtype='datetime64[6h]')
...:
...: d = np.linspace(0,1,len(t))
In [267]: t
Out[267]:
array(['2010-09-01T00', '2010-09-01T06', '2010-09-01T12', '2010-09-01T18'],
dtype='datetime64[6h]')
In [268]: d
Out[268]: array([0. , 0.33333333, 0.66666667, 1. ])
Использование vstack
вместо c_
(просто для удобства):
In [269]: np.vstack((t,d))
...
<__array_function__ internals> in concatenate(*args, **kwargs)
TypeError: invalid type promotion
Ошибка возникает из-за того, что результатом должен быть один dtype
, либо с плавающей запятой, либо datetime64
,Для массивов numpy
требуется унифицированный тип d (например, MATLAB matrix
).
С tolist
или astype(object)
массив datetime64
превращается в datatime
объекты. Их можно объединить с помощью чисел с плавающей точкой, а также преобразовать в объекты:
In [270]: np.vstack((t.tolist(),d))
Out[270]:
array([[datetime.datetime(2010, 9, 1, 0, 0),
datetime.datetime(2010, 9, 1, 6, 0),
datetime.datetime(2010, 9, 1, 12, 0),
datetime.datetime(2010, 9, 1, 18, 0)],
[0.0, 0.3333333333333333, 0.6666666666666666, 1.0]], dtype=object)
In [271]: np.vstack((t.astype(object),d))
Out[271]:
array([[datetime.datetime(2010, 9, 1, 0, 0),
datetime.datetime(2010, 9, 1, 6, 0),
datetime.datetime(2010, 9, 1, 12, 0),
datetime.datetime(2010, 9, 1, 18, 0)],
[0.0, 0.3333333333333333, 0.6666666666666666, 1.0]], dtype=object)
Этот массив dtype объекта похож на MATLAB cell
, содержащий различные элементы.
Другой вариант - создать структурированный массив(вроде как MATLAB struct
):
In [274]: arr = np.zeros(4, dtype=[('t',t.dtype), ('d',d.dtype)])
In [275]: arr
Out[275]:
array([('1970-01-01T00', 0.), ('1970-01-01T00', 0.),
('1970-01-01T00', 0.), ('1970-01-01T00', 0.)],
dtype=[('t', '<M8[6h]'), ('d', '<f8')])
In [276]: arr['t']=t; arr['d']=d
In [277]: arr
Out[277]:
array([('2010-09-01T00', 0. ), ('2010-09-01T06', 0.33333333),
('2010-09-01T12', 0.66666667), ('2010-09-01T18', 1. )],
dtype=[('t', '<M8[6h]'), ('d', '<f8')])
edit
Другой способ построить структурированный массив из этих двух массивов:
In [286]: import numpy.lib.recfunctions as rf
In [293]: rf.merge_arrays((t,d))
Out[293]:
array([('2010-09-01T00', 0. ), ('2010-09-01T06', 0.33333333),
('2010-09-01T12', 0.66666667), ('2010-09-01T18', 1. )],
dtype=[('f0', '<M8[6h]'), ('f1', '<f8')])
Внутренне это похоже на то, что я впервые продемонстрировал.