我有一个数组,其中包含作为距离的数字,另一个数组表示该距离处的某些值。如何计算固定距离值下所有数据的平均值?
例如距离(d):[1 1 14 6 1 12 14 6 6 7 4 3 7 9 1 3 3 6 5 8]
例如对应于距离输入的数据:
因此在d = 1时值为3.3;在d = 1时值= 2,1;在d = 14时值为3.5;等。
[3.3 2.1 3.5 2.5 4.6 7.4 2.6 7.8 9.2 10.11 14.3 2.5 6.7 3.4 7.5 8.5 9.7 4.3 2.8 4.1]
例如,在距离d = 6处,我应该取2.5、7.8、9.2和4.3的平均值
我使用了下面的有效代码,但我不知道如何将值存储到新数组中:
from numpy import mean
for d in set(key):
print d, mean([dist[i] for i in range(len(key)) if key[i] == d])
请帮助!谢谢
答案 0 :(得分:1)
您已经完成了艰辛的工作,只需将结果放入新列表中就很容易了:
result = []
for d in set(key):
result.append(mean([dist[i] for i in range(len(key)) if key[i] == d]))
答案 1 :(得分:1)
使用pandas
g = pd.DataFrame({'d':d, 'k':k}).groupby('d')
选项1:transform
可以将值保留在相同位置
g.transform('mean').values
选项2:直接mean
并获得一个dict
的映射
g.mean().to_dict()['k']
答案 2 :(得分:0)
设置
c(tags$br())
d = np.array(
[1, 1, 14, 6, 1, 12, 14, 6, 6, 7, 4, 3, 7, 9, 1, 3, 3, 6, 5, 8]
)
k = np.array(
[3.3,2.1,3.5,2.5,4.6,7.4,2.6,7.8,9.2,10.11,14.3,2.5,6.7,3.4,7.5,8.5,9.7,4.3,2.8,4.1]
)
+ scipy.sparse
csr_matrix
from scipy import sparse
s = d.shape[0]
r = np.arange(s+1)
m = d.max() + 1
b = np.bincount(d)
out = sparse.csr_matrix( (k, d, r), (s, m) ).sum(0).A1
(out / b)[d]
答案 3 :(得分:0)
您可以将lambda
库中的array
与numpy
一起使用,也可以使用同一库中的{>
您可以定义一个函数以获取所需距离的位置:
where
然后使用它来获取这些位置的值。
假设您拥有:
from numpy import mean, array, where
def key_distances(distances, d):
return where(distances == d)[0]
然后您可能会执行以下操作:
d = array([1,1,14,6,1,12,14,6,6,7,4,3,7,9,1,3,3,6,5,8])
v = array([3.3,2.1,3.5,2.5,4.6,7.4,2.6,7.8,9.2,10.11,14.3,2.5,6.7,3.4,7.5,8.5,9.7,4.3,2.8,4.1])
然后得到你的意思:
vs = v[key_distances(d,d[1])]
答案 4 :(得分:0)
numpy_indexed软件包(免责声明:我是它的作者)在设计时考虑了这些用例:
import numpy_indexed as npi
npi.group_by(d).mean(dist)
熊猫可以做类似的事情;但是它的api并不是真正针对这些事情量身定制的;对于像group by这样的基本操作,我觉得必须将您的数据提升到全新的数据结构中是一种错误。