numpy中的条件产品

时间:2016-02-23 02:02:32

标签: python 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 中所需的元素,但看起来我没有做到正确:

	$('.filmstrip div span').on('click', function(){
		var guts_id = $(this).attr('data-tab');
		$('.filmstrip div span').removeClass('current').addClass('gs');
		$(this).toggleClass('current gs');
		$('.guts, .hero-image').removeClass('active');
		$('.'+guts_id).addClass('active');
	});

	// var guts_id = $('.filmstrip div span').attr('data-tab');

	var fSlide = $('li:first', 'ul');
	var	lSlide = $('li:last', 'ul');

	var fGuts = $('section:first', '.guts-wrapper');
	var	lGuts = $('section:last', '.guts-wrapper');

	var fThumb = $('.thumb:first', '.filmstrip');
	var	lThumb = $('.thumb:last', '.filmstrip');

	var $nextSlide = $('.hero .active').next('li').length ? $('.hero .active').next('li') : fSlide;
	var $prevSlide = $('.hero .active').prev('li').length ? $('.hero .active').prev('li') : lSlide;

	var $nextGuts = $('.guts-wrapper .active').next('section').length ? $('.guts-wrapper .active').next('section') : fGuts;
	var $prevGuts = $('.guts-wrapper .active').prev('section').length ? $('.guts-wrapper .active').prev('section') : lGuts;

	var $nextThumb = $('.filmstrip .alive').next('.thumb').length ? $('.filmstrip .alive').next('.thumb') : fThumb;
	var $prevThumb = $('.filmstrip .alive').prev('.thumb').length ? $('.filmstrip .alive').prev('.thumb') : lThumb;

	// var $nextThumb = $('.filmstrip .thumb .current').next('.thumb').length ? $('.filmstrip .thumb .current').next('.thumb') : fThumb;
	// var $prevThumb = $('.filmstrip .thumb .current').prev('.thumb').length ? $('.filmstrip .thumb .current').prev('.thumb') : lThumb;
	// var	$currentThumb = $('.filmstrip .current');

	$('.next').on('click', function(){
		$('.hero .active').removeClass('active');
		$('.guts-wrapper .active').removeClass('active');
		$('.filmstrip .alive').removeClass('alive').find('.thumb > .current').removeClass('current').addClass('gs');
		$nextSlide.addClass('active');
		$nextGuts.addClass('active');
		$nextThumb.addClass('alive').find('span').addClass('current').removeClass('gs');
		$nextSlide = $('.hero .active').next('li').length ? $('.hero .active').next('li') : fSlide;
		$prevSlide = $('.hero .active').prev('li').length ? $('.hero .active').prev('li') : lSlide;
		$nextGuts = $('.guts-wrapper .active').next('section').length ? $('.guts-wrapper .active').next('section') : fGuts;
		$prevGuts = $('.guts-wrapper .active').prev('section').length ? $('.guts-wrapper .active').prev('section') : lGuts;
		$nextThumb = $('.filmstrip .alive').next('.thumb').length ? $('.filmstrip .alive').next('.thumb') : fThumb;
		$prevThumb = $('.filmstrip .alive').prev('.thumb').length ? $('.filmstrip .alive').prev('.thumb') : lThumb;

	});

	$('.previous').on('click', function(){
		$('.hero .active').removeClass('active');
		$('.guts-wrapper .active').removeClass('active');
		$('.filmstrip .alive').removeClass('alive').find('.thumb > .current').removeClass('current').addClass('gs');
		$prevSlide.addClass('active');
		$prevGuts.addClass('active');
		$prevThumb.addClass('alive').find('span').addClass('current').removeClass('gs');
		$prevSlide = $('.hero .active').prev('li').length ? $('.hero .active').prev('li') : fSlide;
		$prevSlide = $('.hero .active').prev('li').length ? $('.hero .active').prev('li') : lSlide;
		$prevGuts = $('.guts-wrapper .active').prev('section').length ? $('.guts-wrapper .active').prev('section') : fGuts;
		$prevGuts = $('.guts-wrapper .active').prev('section').length ? $('.guts-wrapper .active').prev('section') : lGuts;
		$nextThumb = $('.filmstrip .alive').next('.thumb').length ? $('.filmstrip .alive').next('.thumb') : fThumb;
		$prevThumb = $('.filmstrip .alive').prev('.thumb').length ? $('.filmstrip .alive').prev('.thumb') : lThumb;
	});

我的问题是,我能以某种方式更有效地使用numpy吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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])

应该这样做...它只是说在control_list == 1

的任何地方都在datalist上做产品

答案 2 :(得分:2)

嗯,首先,这些应该是数组:

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

现在,我们可以将control转换为布尔掩码:

control.astype(bool)

使用advanced indexing选择data的相应元素:

data[control.astype(bool)]

将这些元素与np.prod

一起乘以
product = np.prod(data[control.astype(bool)])