假设有n个通道,每个通道都有一个数字值,比如第i个通道的值为f(i)。 我正在考虑使用python列表理解来计算这些通道中w(1< = w< = n)连续和不同产品的平均值。
例如,n = 3,
If w = 1 , return [f(1)+f(2)+f(3)]/3
If w = 2 , return [f(1)f(2)+f(1)f(3)+f(2)f(3)] /3
If w = 3 , return [f(1)f(2)f(3)]/1
这些指数可以通过以下方式实现:
[[i,j,k] for i in xrange(2) for j in xrange(2) for k in xrange(2) if i+j+k ==w]
然而,这些代码显然不能推广到任何n。 在此先感谢您的帮助!
答案 0 :(得分:0)
当N
非常大时,这是列表推导的一个不好的示例,因为当每个变量开启或关闭时,您需要N
变量for i in xrange(2)
,但它相当简单与itertools.combination
例如,要克隆您的N=3
示例:
results = []
for w in range(1,4):
results += [[i,j,k] for i in xrange(2) for j in xrange(2) for k in xrange(2) if i+j+k ==w]
您获得的结果为:[[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
现在使用itertools.combination以下内容可以扩展到更大的N.
import itertools
results = []
N=3
for w in range(1,N+1):
results += list(itertools.combinations(range(N),w))
您获得[(0,), (1,), (2,), (0, 1), (0, 2), (1, 2), (0, 1, 2)]
的结果,即返回非零变量的索引。
这可以简单地转换为另一种形式,例如:
for index_tuple in results:
new = [0]*N
for i in index_tuple:
new[i] = 1
new_results.append(new)
其中new_results
具有相同的格式[[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1]]
,并且可以简单地扩展为更大的N.(当然,最好将它保留为第一种形式,或使用numpy之类的东西来有效地使用屏蔽阵列)。
答案 1 :(得分:0)
我会保持这个简短的说明:
Python 2
>>> import itertools
>>> from operator import mul
>>> from __future__ import division
>>> def calc(f, w):
if w >= 1 and w <= len(f):
l = [reduce(mul, comb) for comb in itertools.combinations(f, w)]
return round(sum(l)/len(l), 3)
>>> calc([1,2,3], 2)
3.667
>>> calc([2,2,2,1], 2)
3.0
Python 3
>>> import itertools
>>> from operator import mul
>>> from functools import reduce
>>> def calc(f, w):
if w >= 1 and w <= len(f):
l = [reduce(mul, comb) for comb in itertools.combinations(f, w)]
return round(sum(l)/len(l), 3)
>>> calc([1,2,3], 2)
3.667
>>> calc([2,2,2,1], 2)
3.0
有关乘法部分的解释,请参阅What's the Python function like sum() but for multiplication? product()?。