假设一个(1-d)阵列,是否可以计算不同大小的给定组的平均值而不进行循环?而不是
avgs = [One_d_array[groups[i]].mean() for i in range(len(groups))]
像
这样的东西avgs = np.mean(One_d_array, groups)
基本上我想这样做:
M = np.arange(10000)
np.random.shuffle(M)
M.resize(100,100)
groups = np.random.randint(1, 10, 100)
def means(M, groups):
means = []
for i, label in enumerate(groups):
means.extend([M[i][groups == j].mean() for j in set(p).difference([label])])
return means
这是在
运行%timeit means(M, groups)
100 loops, best of 3: 12.2 ms per loop
加速10次左右就已经很好了
答案 0 :(得分:1)
无论你是否看到一个循环,都有一个循环 这是一种方式,但循环只是隐藏在对map的调用中:
In [10]: import numpy as np
In [11]: groups = [[1,2],[3,4,5]]
In [12]: map(np.mean, groups)
Out[12]: [1.5, 4.0]
答案 1 :(得分:0)
另一个隐藏循环是使用np.vectorize
:
>>> x = np.array([1,2,3,4,5])
>>> groups = [[0,1,2], [3,4]]
>>> np.vectorize(lambda group: np.mean(x[group]), otypes=[float])(groups)
array([ 2. , 4.5])