我有一个列表,用于控制数据列表中的哪些术语必须乘以
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吗?
答案 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
答案 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)])