Как создать структуру данных с похожим numpy ой массивом - PullRequest
1 голос
/ 20 февраля 2020

у меня есть следующая функция:

def check_smaller_zeros(v):
   return v < 0

Когда я создаю массив с numpy, я могу написать следующий код для поэлементного измерения:

v_1 = numpy.array([1, 2, -4, -1])
result = check_smaller_zeros(v_1)
# result: [False, False, True, True]

, но когда я попробуйте повторить это с tuple, set, frozenset и list / array reise следующая ошибка:

TypeError: '<' not supported between instances of 'tuple' and 'int'

что именно позволяет массиву numpy иметь возможность для такого поведения? Это выглядит удобно, но немного неочевидно

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Python позволяет переопределять операторы с помощью специальных методов «dunder» (двойное подчеркивание). Например, давайте создадим пользовательскую структуру данных, которая наследуется от tuple. Чтобы заставить < выполнять поэлементное сравнение, нам просто нужно переписать метод __lt__.

In [1]: class MyList(tuple):
      :     def __lt__(self, other):
      :         return tuple(v < other for v in self)
      :

In [1]:

In [2]: l = MyList([1,2,3,4,5])

In [3]: l < 3
Out[3]: (True, True, False, False, False)

Список всех таких методов можно найти в документации Python в разделе Модель данных .

0 голосов
/ 20 февраля 2020

np.array сильно отличается от кортежей, списков и т. Д. c. Если вы хотите обобщить свою функцию, вам нужно подумать о каждом случае.

In [111]: def check_smaller_zeros(v):
     ...:    if type(v) is np.array:
     ...:        return v < 0
     ...:    elif type(v) in (list, tuple):
     ...:        return [x<0 for x in v]
     ...:

In [112]: check_smaller_zeros((-1,1,2,3,4,5))
Out[112]: [True, False, False, False, False, False]

В некоторых случаях вы можете просто преобразовать объект в массив np.array. Но это зависит от объекта, и вы должны заранее определить варианты использования.

In [114]: def check_smaller_zeros(v):
     ...:    if type(v) is np.array:
     ...:        return v < 0
     ...:    else:
     ...:        return np.array(v) < 0
     ...:
     ...:

In [115]: check_smaller_zeros((-1,1,2,3,4,5))
Out[115]: array([True, False, False, False, False, False])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...