Получил `TypeError` при использовании` np.unique` в списке объектов, содержащих `datetime` (Python / Numpy) - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь использовать np.setdiff1d между двумя объектами Python, но не могу управлять. Я обнаружил, что не могу использовать np.union в списке объектов, содержащих дату и время!

Для воспроизведения ошибки:

import numpy as np
from datetime import datetime

d = datetime.now()
a = [(1, d), (2, d), (3, d), (3, d)]
np.unique(a)

И это приводит к следующей ошибке:

  File "<ipython>", line 6, in <module>
    np.unique(a)
  File "/usr/local/lib/python3.6/dist-packages/numpy/lib/arraysetops.py", line 264, in unique
    ret = _unique1d(ar, return_index, return_inverse, return_counts)
  File "/usr/local/lib/python3.6/dist-packages/numpy/lib/arraysetops.py", line 312, in _unique1d
    ar.sort()
TypeError: '<' not supported between instances of 'datetime.datetime' and 'int'

Это ошибка от NumPy? Знаете ли вы, есть ли другой способ решить то, что я пытаюсь сделать (изначально желая использовать np.setdiff1d between 2 lists of a similar structure)?

Заранее спасибо !!

1 Ответ

0 голосов
/ 01 ноября 2019

Вот причина: numpy.unique сначала сгладит массив. Из документации:

Входной массив. Если ось не указана, она будет сглажена, если она еще не является 1-D.

Итак, вам нужно подумать, по какой оси вы хотите, чтобы элементы были уникальными (для NumPy вашсписки кортежей будут выглядеть как двумерный массив);затем используйте правильное ключевое слово axis. К сожалению, вы быстро обнаружите, что это тоже не сработает, поскольку элементы рассматриваются как объект (поскольку NumPy пытается смешать целые числа и даты и времени в один тип объекта), что в NumPy не позволяет проводить сравнение.

Но так как вы используете список кортежей (там нет ничего NumPy), просто используйте set():

>>> from datetime import datetime
>>>
>>> d = datetime.now()
>>> a = [(1, d), (2, d), (3, d), (3, d)]
>>> set(a)
{(2, datetime.datetime(2019, 11, 1, 17, 15, 38, 578611)), (1, datetime.datetime(2019, 11, 1, 17, 15, 38, 578611)), (3, datetime.datetime(2019, 11, 1, 17, 15, 38, 578611))}

Обратите внимание, что набор естественно неупорядочен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...