2016-10-15 2 views
0

Я пытаюсь начать с пустого массива numpy. По мере продвижения кода первая колонка должна быть заполнена datetime.datetime, вторая колонка должна быть заполнена str, третьи колонки - float и четвертая колонка с int.Как создать пустой массив numpy для хранения различных видов данных

Я попытался следующие:

A = np.empty([10, 4]) 
A[0][0] = datetime.datetime(2016, 10, 1, 1, 0) 

Я получаю ошибку:

TypeError: float() argument must be a string or a number 
+1

['Структурированные массивы'] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) может быть одним из вариантов. – Divakar

ответ

1

структурированный подход массива:

определяют DTYPE в соответствии с вашими спецификациями колонки:

In [460]: dt=np.dtype('O,U10,f,i') 
In [461]: from datetime import datetime 

инициализировать пустой массив, с 3-х элементов (не 3х4)

In [462]: A = np.empty((3,), dtype=dt) 
In [463]: A 
Out[463]: 
array([(None, '', 0.0, 0), (None, '', 0.0, 0), (None, '', 0.0, 0)], 
     dtype=[('f0', 'O'), ('f1', '<U10'), ('f2', '<f4'), ('f3', '<i4')]) 

заполняющих некоторые значения - по названию поля (не номер столбца)

In [464]: A['f1']=['one','two','three'] 
In [465]: A['f0'][0]=datetime(2016, 10, 1, 1, 0)  
In [467]: A['f2']=np.arange(3) 
In [468]: A 
Out[468]: 
array([(datetime.datetime(2016, 10, 1, 1, 0), 'one', 0.0, 0), 
     (None, 'two', 1.0, 0), 
     (None, 'three', 2.0, 0)], 
     dtype=[('f0', 'O'), ('f1', '<U10'), ('f2', '<f4'), ('f3', '<i4')]) 

Посмотреть на элемент этого массива:

In [469]: A[0] 
Out[469]: (datetime.datetime(2016, 10, 1, 1, 0), 'one', 0.0, 0) 

Я решил сделать 1-ю поле object DTYPE, так что он может держать datetime объект - который не является числом или строкой.

np.datetime64 хранит даты как поплавок, и предоставляет много функциональных возможностей, которые datetime объекты не:

In [484]: dt1=np.dtype('datetime64[s],U10,f,i') 
In [485]: A1 = np.empty((3,), dtype=dt1) 
In [486]: A1['f0']=datetime(2016, 10, 1, 1, 0) 
In [487]: A1['f3']=np.arange(3) 
In [488]: A1 
Out[488]: 
array([(datetime.datetime(2016, 10, 1, 1, 0), '', 0.0, 0), 
     (datetime.datetime(2016, 10, 1, 1, 0), '', 0.0, 1), 
     (datetime.datetime(2016, 10, 1, 1, 0), '', 0.0, 2)], 
     dtype=[('f0', '<M8[s]'), ('f1', '<U10'), ('f2', '<f4'), ('f3', '<i4')]) 

Третий подход является сделать весь массив объектов DTYPE. Это действительно прославленный список. Многие операции прибегают к простой итерации или просто не реализованы. Это более общий, но вы теряете большую часть обычных числовых массивов.

1

Вы можете использовать dtype=object.

A = np.empty([10, 4], dtype=object) 
A[0][0] = datetime.datetime(2016, 10, 1, 1, 0) 

Также возможно использовать структурированные массивы, но тогда у вас есть фиксированная длина для строковых объектов. Если вам нужны произвольные большие объекты, вы должны использовать dtype=object. Но это часто противоречит назначению массивов.

+0

Что значит «противоречит цели массивов»? Это влияет на производительность? – Zanam

Смежные вопросы