2016-02-23 4 views
0

У меня есть список, который контролирует, какие условия в списке данных должны быть умноженыусловный продукт в NumPy

control_list = [1, 0, 1, 1, 0] 
data_list = [5, 4, 5, 5, 4] 

Мне нужно найти произведение элементов в data_list, для которых control_list имеет 1. Моя нынешняя попытка наивна и выглядит уродливой!

product = 1 
for i in range(len(control_list)): 
    if control_list[i]: 
     product *= data_list[i] 

Я смотрел на numpy.where(), чтобы получить необходимые элементы в data_list, но, похоже, я не получил это право:

numpy.where(control_list, data_list) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-12-1534a6838544> in <module>() 
----> 1 numpy.where(control_list, data_list) 

ValueError: either both or neither of x and y should be given 

Мой вопрос, могу ли я сделать это как-то с помощью NumPy более эффективно?

ответ

3
control_list = numpy.array([1, 0, 1, 1, 0]) 
data_list = numpy.array([5, 4, 5, 5, 4]) 
numpy.product(data_list[control_list==1]) 

должен это сделать ... он просто говорит, что делать продукт на DataList везде, где control_list == 1

+0

гы! мне это не показалось, это было так просто! благодаря :) – okkhoy

3

Попробуйте это. Вы можете преобразовать control_list в список логических элементов, а затем использовать его для индексации в data_list. Затем вы можете использовать функцию продукта numpy, чтобы получить произведение всех значений.

>>> import numpy as np 
>>> cList = np.array(control_list, dtype=np.bool) 
>>> cList 
array([ True, False, True, True, False], dtype=bool) 
>>> data_list = np.array(data_list) 
>>> data_list[cList] # numpy supports fancy indexing 
array([5, 5, 5]) 
>>> np.product(data_list[cList]) 
125 
2

Ну, во-первых, они должны быть массивами:

control = np.array([1, 0, 1, 1, 0]) 
data = np.array([5, 4, 5, 5, 4]) 

Теперь мы можем конвертировать control в булевую маску:

control.astype(bool) 

Выберите соответствующие элементы data с advanced indexing:

data[control.astype(bool)] 

И умножьте эти элементы вместе с np.prod:

product = np.prod(data[control.astype(bool)]) 
Смежные вопросы