Как вставить столбец другого типа в массив numpy? - PullRequest
0 голосов
/ 20 января 2019

Я хотел бы добавить два массива типа np.datetime64 и int к другому.

Это приводит к ошибке.Что я должен сделать, чтобы исправить это?

Это работает без ошибок, если я добавляю векторы к себе (то есть: np.append(c,c,axis=1) или np.append(a,a,axis=1))

numpy версия: 1.14.3

import numpy as np
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)
c
Out[2]: 
array([[0],
       [1],
       [2],
       [3],
       [4]])
d = np.append(c,a,axis=1)
Traceback (most recent call last):
  File "/home/claudia/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-3-10548a83d1a2>", line 1, in <module>
    d = np.append(c,a,axis=1)
  File "/home/claudia/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py", line 5166, in append
    return concatenate((arr, values), axis=axis)
TypeError: invalid type promotion

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вероятно, проще всего - работать с 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.

0 голосов
/ 20 января 2019

Принимая во внимание заявления других пользователей, можно понять, что преобразование первого массива в dtype object - это как минимум обходной путь.

import numpy as np
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]')
a = a.astype("object")
c = np.array([0,1,2,3,4]).reshape(-1,1)
d = np.append(a,c,axis=1)
d

.

array([[datetime.datetime(2018, 4, 1, 15, 30), 0],
   [datetime.datetime(2018, 4, 1, 15, 31), 1],
   [datetime.datetime(2018, 4, 1, 15, 32), 2],
   [datetime.datetime(2018, 4, 1, 15, 33), 3],
   [datetime.datetime(2018, 4, 1, 15, 34), 4]], dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...