2015-06-18 2 views

ответ

0

Это даст вам булевский массив.

numpy.x([1,1,1]) == numpy.y([1,1,1])

+0

Поскольку мой предыдущий комментарий удален, этот код неверен. Пожалуйста, напишите какой-нибудь реальный код. – juanchopanza

2
>>> x = ("a", "b", "c") 
>>> y = ("a", "d") 
>>> map(y.__contains__, x) 
[True, False, False] 

класс содержит тест может быть ускорен вверх, если у хранитс установить потому, что O (1) используют хэш-таблицы избежать ненужных сравнений:

>>> y = {"a", "d"} 

Не обманывайте фиктивные тайминги от другого респондента. Для нетривиальных наборов данных повторные поиски O (n) - ужасная идея. Тайминги также были неправильно интерпретированы (при тестировании только трех входов на двухпозиционное пространство поиска стоимость одноразовых глобальных поисков переменных для map и имеет тенденцию доминировать во времени). Кроме того, другой ответчик проигнорировал предупреждения, выпущенные инструментом синхронизации, которые показывают, что его тайминги дико непоследовательны (возможно, из-за промежуточных результатов кэширования, при которых тайминги бесполезны).

Я полагаю, что если вы делаете R стиль статистический анализ, ваши данные больше, чем A B C и A D. Другой ответ настроен на этот набор данных игрушек и не масштабируется ни в чем, что вам может быть интересно.

In [1]: import random 

In [2]: people = [random.choice(['man', 'woman', 'boy', 'girl']) for i in range(1000)] 

In [3]: children = ['boy', 'girl'] 

In [4]: %timeit [p in children for p in people] 
10000 loops, best of 3: 65 µs per loop 

In [5]: %timeit map(children.__contains__, people) 
10000 loops, best of 3: 58.5 µs per loop 

In [6]: %timeit map(set(children).__contains__, people) 
10000 loops, best of 3: 49.8 µs per loop 

Поскольку пространство поиска становится больше, чем просто два выбора, разница между O (1) и O (N) поиска становится все более важным:

In [10]: scores = [random.choice(range(10)) for i in range(1000)] 

In [11]: evens = [0, 2, 4, 6, 8] 

In [12]: %timeit [x in evens for x in scores] 
10000 loops, best of 3: 98.2 µs per loop 

In [13]: %timeit map(evens.__contains__, scores) 
10000 loops, best of 3: 90.5 µs per loop 

In [14]: %timeit map(set(evens).__contains__, scores) 
10000 loops, best of 3: 57.6 µs per loop 
+0

Просто любопытно: вы приурочили его? Для такого небольшого количества элементов мне интересно, стоит ли создавать экземпляры набора. Я вижу, что это может иметь смысл для больших чисел. – juanchopanza

+0

Например, на моей платформе это решение занимает примерно в два раза больше, чем простое понимание списка. – juanchopanza

1

Я хотел бы использовать Библиотека анализа данных Python «pandas» для такого рода материалов, которая требует операций, аналогичных R. Вы можете начать работу здесь: http://pandas.pydata.org/. Эквивалент python для% in% с использованием pandas будет «isin» (здесь есть примеры: http://pandas.pydata.org/pandas-docs/stable/comparison_with_r.html#match)

+0

Не могли бы вы подробнее рассказать о своем решении, добавив немного подробного описания вашего решения? – abarisone

+0

Спасибо большое! «isin» - это именно то, что я ищу –

0

Python не поставляется с оператором, который делает именно то, что вы хотите. Один из вариантов заключается в том, чтобы адаптировать ваш код, чтобы сделать что-то «питоническим» способом. Другой вариант - использовать перегрузку оператора для создания пользовательского оператора для определенного класса.

Вариант 1, вероятно, лучше всего сделать: это более просто, и ваш код будет легче читать и модифицировать. Вариант 2 (на мой взгляд) более увлекателен, но, вероятно, имеет смысл только в том случае, если вы создаете язык, специфичный для домена, или работаете на небольшой базе кода, которую вы полностью контролируете.

Koba предлагает несколько вариантов. Мое личное мнение состоит в том, чтобы просто использовать понимание списка, а не map: Python 3 имеет map возвращает итератор в противоположность списку, и есть некоторая история с людьми, которые находят список понятий более читабельными (и доброжелательный диктатор Питона на всю жизнь, Гвидо, предпочитает список понимание карт).Таким образом, я думаю, что это лучший вариант 1:

people = ['man', 'woman', 'boy', 'girl'] 

children = ['boy', 'girl'] 

output = [p in children for p in people] 

Вариант 2 будет работать путем создания пользовательского объекта, возможно, тот, который расширяет список или другой итерацию. Он переопределит специальный метод (так работают операторы на Python).

In [1]: class mylist(list): 
    ...:  def __mod__(self, other): 
    ...:   return [s in other for s in self] 
    ...: 

In [2]: people = mylist(['man', 'woman', 'boy', 'girl']) 

In [3]: children = ['boy', 'girl'] 

In [4]: people % children 
Out[4]: [False, False, True, True]