Вероятно, проще всего - работать с Pandas DataFrame
вместо массива
По правде говоря, хотя массивы Numpy можно создавать для работы с гетерогенными столбцами, они могут не соответствовать потребностям большинства пользователей в этом случае.Для многих случаев использования вам может быть лучше использовать Pandas DataFrame
.Вот как преобразовать ваши два столбца в DataFrame
с именем df
:
import numpy as np
import pandas as pd
a = np.array([['2018-04-01T15:30:00'],
['2018-04-01T15:31:00'],
['2018-04-01T15:32:00'],
['2018-04-01T15:33:00'],
['2018-04-01T15:34:00']], dtype='datetime64[s]')
c = np.array([0,1,2,3,4]).reshape(-1,1)
df = pd.DataFrame(dict(date=a.ravel(), val=c.ravel()))
print(df)
# output:
# date val
# 0 2018-04-01 15:30:00 0
# 1 2018-04-01 15:31:00 1
# 2 2018-04-01 15:32:00 2
# 3 2018-04-01 15:33:00 3
# 4 2018-04-01 15:34:00 4
Затем вы можете работать с каждым из ваших столбцов следующим образом:
print(df['date'])
# output:
# 0 2018-04-01 15:30:00
# 1 2018-04-01 15:31:00
# 2 2018-04-01 15:32:00
# 3 2018-04-01 15:33:00
# 4 2018-04-01 15:34:00
# Name: date, dtype: datetime64[ns]
DataFrame
объекты предоставляют массу методов, которые позволяют довольно легко анализировать данные такого рода.См. Pandas docs (или другие QA на этом сайте) для получения дополнительной информации о DataFrame
объектах.
Numpy only solution - структурированные массивы
Как правило, вам следует избегатьмассивы dtype=object
, если можете.Они вызывают проблемы с производительностью во многих основных операциях Numpy (таких как арифметика, например, arr0 + arr1
), и они могут вести себя не так, как вы ожидаете.
Лучшим решением только для Numpy являются структурированные массивы.Эти массивы имеют состав dtype
, с одной частью на поле (ради этого обсуждения «поле» эквивалентно «столбцу», хотя вы можете делать более интересные вещи с полями ).Учитывая ваши массивы a
и c
, вот как вы можете создать структурированный массив:
# create the compound dtype
dtype = np.dtype(dict(names=['date', 'val'], formats=[arr.dtype for arr in (a, c)]))
# create an empty structured array
struct = np.empty(a.shape[0], dtype=dtype)
# populate the structured array with the data from your column arrays
struct['date'], struct['val'] = a.T, c.T
print(struct)
# output:
# array([('2018-04-01T15:30:00', 0), ('2018-04-01T15:31:00', 1),
# ('2018-04-01T15:32:00', 2), ('2018-04-01T15:33:00', 3),
# ('2018-04-01T15:34:00', 4)],
# dtype=[('date', '<M8[s]'), ('val', '<i8')])
Затем вы можете получить доступ к определенным столбцам, проиндексировав их по имени (так же, как вы могли бы с помощью DataFrame
):
print(struct['date'])
# output:
# ['2018-04-01T15:30:00' '2018-04-01T15:31:00' '2018-04-01T15:32:00'
# '2018-04-01T15:33:00' '2018-04-01T15:34:00']
Подводные камни структурированных массивов
Например, нельзя добавить два структурированных массива:
# doesn't work
struct0 + struct1
, но вы можете добавить поляиз двух структурированных массивов:
# works great
struct0['val'] + struct1['val']
Как правило, поля ведут себя так же, как стандартные массивы Numpy.