数组中的值与另一个数组的值相对应

时间:2018-12-07 21:02:36

标签: python numpy average

我有一个数组,其中包含作为距离的数字,另一个数组表示该距离处的某些值。如何计算固定距离值下所有数据的平均值?

例如距离(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])

请帮助!谢谢

5 个答案:

答案 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库中的arraynumpy一起使用,也可以使用同一库中的

您可以定义一个函数以获取所需距离的位置:

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这样的基本操作,我觉得必须将您的数据提升到全新的数据结构中是一种错误。